一.const修饰成员函数的格式
在成员函数的后边加上const
void display() const
{
swap(5);
cout << "display()" << endl;
}
二.const修饰成员函数的原理
2.1.原理
const修饰成员函数时是修饰成员函数的this指针所指向的对象,也就是保证在调用这个const成员函数的对象时不会被改变。
注意:const是修饰this指针所指向的对象
2.2.编译器对const成员函数的处理(图解)
三.问题
3.1. const对象可以调用const修饰的成员函数,和非const修饰的成员函数吗?
const对象可以调用const修饰的成员函数,不能调用非cosnt修饰的成员函数。
原因:
class A
{
public:
void show()
{
cout << "show()" << endl;
}
void display() const
{
cout << "display()" << endl;
}
};
int main()
{
const A a;
//a.display();
a.show();
system("pause");
return 0;
}
我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在A类中,
实际的show函数应该是这样的void show(show * this)
实际的display函数应该是 void display(const display* this)
这时a对象的指针就会传递给show*this,但是a的地址被翻译为指针类型应该是const show* this,这里会出现类型不匹配的错误,在visual studio 中会出现类似于上面的错误。这里的display函数可以调用成功是因为他们参数的类型匹配。
3.2.非const对象可以调用const修饰的成员函数,和非const修饰的成员函数吗?
非const对象可以调用const修饰的成员函数,和非const修饰的成员函数
这是因为在c++中其实是有最小权限原则,非const对象是可以调用const成员函数的
3.3.const成员函数不能调用非const成员函数
3.4.非const成员函数能调用const成员函数