标签:stl c++ c++ primer 类与数据抽象
C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针
1、引言
在前面提到过,成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为this.
2、返回*this
成员函数有一个隐含的附加形参,即指向该对象的指针,这个隐含的形参叫做this指针(编译器自动传递)使用this指针保证了每个对象可以拥有不同数值的数据成员,但处理这些成员的代码可以被所有对象共享。成员函数是只读的代码,由所有对象共享,并不占对象的存储空间,因为this指针指向当前对象,所以成员函数可以区分它所作用的对象是哪一个。
3、从const成员返回*this
在普通的非const成员函数中,this的类型是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。
不能从const成员函数返回指向类对象的普通引用。如果将display作为 Screen的 const成员,则 display内部的 this指针将是一个constScreen* 型的const。然而:
myScreen.move(4,0).set('#').display(cout); //OK myScreen.display().set('*'); //Error
4、可变数据成员
有时,我们希望类的数据成员(甚至是在const成员函数中)可以修改。这可以通过将它们声明为mutable来实现。
可变数据成员永远都不能为const,甚至当它们是const对象的成员时也如此。因此,const成员函数可以改变mutable成员。
class Screen { public: //... private: mutable size_t access_ctr; //使用access_ctr来跟踪Screen成员函数的调用频度 void do_display(std::ostream &os) const { ++ access_ctr; //OK os << contents; } };
【实践:看一道经典的题目】
class A { public: int m; voidprint() { cout << "A" << endl; } }; A *pa = 0; pa->print();
相当于成员函数传递的this指针为0,那调用会出错吗? 肯定是正确输出"A"的,因为this为0 表示没有对某个对象进行操作,而print里面确实没有对某个对象成员进行操作,所以是可以运行的。
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针
标签:stl c++ c++ primer 类与数据抽象
原文地址:http://blog.csdn.net/keyyuanxin/article/details/47058629