码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer 学习笔记_16_类与数据抽象(2)_隐含的this指针

时间:2015-07-25 20:05:05      阅读:141      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!