什么是const成员函数

2025-04-29 09:24:05
推荐回答(1个)
回答1:

以下面这个例子来说明:
class base{
public: ...
void print()const{
cout<} ...private:
int n;
}12345678910

我们知道将成员函数修饰为const的,那么这个函数就不能修改成员变量,也不能调用非const的成员函数。至于,为什么会有这样的功能,下面一一道来:
我们知道成员函数都有一个隐藏的参数那就是this指针,这个指针指向该类的本身。我们应该知道的是一个类对象的是由哪些部分构成的。对于一个类其独有的东西就是他里面的非静态成员、虚函数表。而成员函数是所有类对象共享的。那么这些由一个类的所有对象共享的函数是如何区分各个类对象呢。答案就是通过this指针。
base B;
B.print();12

这里声明了一个类对象,然后用类对象调用了print方法。它的实质不妨这样理解:
base B;
print(&B); //这里只是为了说明12

成员函数接受一个类对象的指针。到了函数内部就成了这样:
print(base * const this){
cout<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;
cout<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的成员函数。