Loading

面向对象 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关键字修改了传入的对象指针;

  此时,形参实参是匹配的。

总之,这里可以用参数传递的知识来判断。

 

posted @ 2017-04-29 21:29  lif323  阅读(216)  评论(0编辑  收藏  举报