面向对象 const成员函数的理解
c++类中可以用const关键字来声明不修改对象的成员函数,它使用时需要注意:
1、常量对象只能调用const成员函数
2、非常量对象可以调用const成员函数
以下列代码为例,来解释:
1 class Person{ 2 public: 3 void print(){ 4 cout<<"I am a common function!"<<endl; 5 } 6 void show()const{ 7 cout<<"I am a const function!"<<endl; 8 } 9 }; 10 int main(){ 11 const Person a; 12 a.print(); 13 }
程序编译结果为:
[Error] passing 'const Person' as 'this' argument of 'void Person::print()' discards qualifiers [-fpermissive]
可以理解为在对象调用成员函数时,会传入this指针:
1、常对象调用非常成员函数的错误原因:
print函数原型为
print(Person *const a,int i);(伪代码)
成员函数的调用 a.print()可以等价为:
print(&a,1);(伪代码)
即this作为隐式参数传入,但a指针的类型为 const Person *const;
在此处可以用函数参数传递的知识来解释,即实参:指向常对象的常指针,形参:指向普通对象的常指针,实参形参不匹配(从编译错误也能看到这一点)。
2、常对象能够调用常成员函数的原因:
show的函数原型可以视为,
show(const Person*const a,int i);(伪代码)
即const关键字修改了传入的对象指针;
此时,形参实参是匹配的。
总之,这里可以用参数传递的知识来判断。