成员函数const(成员函数的定义)

http://www.itjxue.com  2023-01-28 03:08  来源:未知  点击次数: 

在类的成员函数后面加 const 是什么意思

每个类成员都有隐含的指向调用成员函数的类对象的this指针,成员函数形参表后的const修饰的是this,也就是

ClassName

cn;

const

ClassName

*cp=cn;

这个this就相当于cp,是‘自认为’指向const对象的指针,因此该const成员函数不能对对象进行写操作

什么是const成员函数

以下面这个例子来说明:

class base{

public: ...

void print()const{

coutn;

} ...private:

int n;

}12345678910

我们知道将成员函数修饰为const的,那么这个函数就不能修改成员变量,也不能调用非const的成员函数。至于,为什么会有这样的功能,下面一一道来:

我们知道成员函数都有一个隐藏的参数那就是this指针,这个指针指向该类的本身。我们应该知道的是一个类对象的是由哪些部分构成的。对于一个类其独有的东西就是他里面的非静态成员、虚函数表。而成员函数是所有类对象共享的。那么这些由一个类的所有对象共享的函数是如何区分各个类对象呢。答案就是通过this指针。

base B;

B.print();12

这里声明了一个类对象,然后用类对象调用了print方法。它的实质不妨这样理解:

base B;

print(B); //这里只是为了说明12

成员函数接受一个类对象的指针。到了函数内部就成了这样:

print(base * const this){

coutthis-n;

}123

散部在类对象外部的成员函数,通过一个类对象的指针来对类对象进行操作。这其实和C语言里面针对一个结构体写很多对于结构体进行操作的函数一样。当我们需要操作结构体的时候,我们就要传递一个结构体的指针给这个函数。这下应该明白,这个this的意义了吧。当然这里的this是const的我们不能在成员函数类修改this的指向。

那么现在话题回到成员函数后面的const上面。它依然和this有关系。在上面讲this指针的时候,我们知道有下面这样的转化:

B.print();

|

Vprint(B);

|

Vprint(base * const this){ //...do something

}123456789

所以在函数里面我们可以做:

print(base * const this){ this-n=100;

coutthis-n;

}1234

在成员函数里面我们可以修改成员变量,但是这里我们明显是不希望修改的。所以我们可以做下面这样的修改:

print(const base* const this){ this-n=100; //错误,*this是const的。

}123

将指针指向的对象声明为常量,这就保证了成员函数内部的操作不能修改成员变量了。但是我们知道this是隐式的,我们要在哪里使用const来修饰this指针指向的对象呢。C++的设计者们说,把他放在函数的后面吧。所以就有了文章开头的那种写法。

下面考虑这样一种情况,我们申明了一个常量对象

const base B;

B.print();

|

vprint(B);12345

在print函数里面,有与B是const的,所以*this是const的,而在非const的成员函数中,隐式的申明是base * const this 所以常量对象调用调用非const的成员函数,那么就要将const base* const this转化为base* const this 这显然是不允许的,所以cosnt对象不能调用非const的成员函数。

放在函数后面的const是什么意思

const就是说这个函数操作不会对变量或是对象之类的值有影响 比如你有一个human类 你现在要得到某个human类对象A的age 那么肯定是不会因为你想得到这个值而改变了age的大小 对吧 那么你就可以写一个函数int getAge()const这样就好 这么做是为了防止你在函数中对不应该在这里改变的量不小心进行了改变。这样的函数叫常成员函数。常成员函数可以理解为是一个“只读”函数,它既不能更改数据成员的值,也不能调用那些能引起数据成员值变化的成员函数,只能调用const成员函数。

const修饰说明它是一个常量,它的值是不能被修改的。没有什么地方是必须要用的,你只要觉得这个数字你不会改变就可以用。一般在函数传递参数中用的比较多,你可以看看C语言的库函数参数中很多都是用const修饰的。

比如字符串拷贝的声明函数char *strcpy(char *dest,const char *src); 后边的形参用了const修饰,在函数定义中src的值就不能被改变,dest的值就可以被改变,也是一种提示的作用说明字符串是从src拷贝到dest中

(责任编辑:IT教学网)

更多

推荐杀毒防毒文章