C++12.2 隐含的this指针(不懂)、mutable数据成员

来源:互联网 发布:qq视频变声软件 编辑:程序博客网 时间:2024/04/20 06:49

简介

  • 声明为const的成员函数是没法修改数据成员的,这时候我们可以把数据成员声明为mutable类型

  • 私有的mutable类型数据成员,任然是无法通过对象直接的,还是需要成员函数来访问。

7.7.1节
12.1.3节

=====================================================================================================================================

//12.1.3节定义的Screen类class Screen{public:    typedef std::string::size_type index; //stirng类型的下标size_type.的同义词index    char get() const{return contents[cursor];}//一个const类型的函数get,但是没有形参,返回的是一个string值。string1[size_type]。    char get(index ht,index wd) const; //声明一个const类型的函数get,返回char类型的值private:    std::string contents;//string对象contents    index cursor;    index height,width;//stirng::size_type(下标)类型的数据成员.};
  • 成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为this,与调用成员函数的对象绑定一起。成员函数不能定义this形参 ,而是由编译器隐含定义。

  • 成员函数的函数体可以显示使用this指针,但不是必须这么做,如果对类成员的引用没有限定,编译器会将这种引用处理成通过this指针的引用。

1.何时使用this指针

  • 尽管在成员函数内部显示引用this通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最常用的情况是在这样的函数中使用this:该函数返回对调用该函数的对象的引用。

  • 某种类可能具有某些操作,这些操作应该返回引用,Screen类就是这样的一个类。迄今为止,我们的类只有一对get操作。逻辑上,我们可以添加下面的操作。

    • 一对set操作,将特定字符或光标指向的字符设置为给定值;
    • 一个move操作,给定两个index值,将光标移至新位置。
//理想情况下,希望用户能够将这些操作的序列连接成一个单独的表达式myScreen.move(4.0).set('#');
//等价于myScreen.move(4.0);myScreen.set('#');

2.返回 *this

  • 在单个表达式中调用move 和set 操作时,每个操作必须返回一个引用,该引用指向执行操作的那个对象:
class Screen{public:    typedef std::string::size_type index; //stirng类型的下标size_type.的同义词index    Screen& move(index r,index c);    Screen& set(char);    Screen& set(index,index,char);};//注意这些函数的返回类型是Screen&,指明该成员函数返回对其自身类类型的对象的引用。每个函数都返回调用自己的那个对象。下面的例子使用this指针来访问该对象。
Screen& Screen::set(char c){   contents(cursor)=c;   return *this;}Screen& Screen::move(index r,index c){   index row = r*width;   cursor=row+c;   return *this;}//函数中唯一需要关注的部分是return 语句。在这两个操作中,每个函数都返回* this。在这些函数中,this是一个指向非常量Screen的指针。如同任意的指针一样,可以通过对this指针解引用来访问this指向的对象。

3.从const成员函数返回*this

  • 在普通的非const成员函数中,this的类型是一个指向类类型的const指针(4.2.5),可以改变this所指向的值,但不能改变this所保存的地址。

  • 在const成员函数中,this的类型是一个指向const类类型对象的const指针,既不能改变this所指向的对象,也不能改变this所保存的地址

  • 不能从const成员函数返回指向类对象的普通引用。const成员函数只能返回* this作为一个const引用。

4.基于const的重载

看不懂

5.可变数据成员—-mutable

  • 有时候,我们希望类的数据成员(甚至在const成员函数内)可以修改,这可以通过将他们声明为mutable来实现

-可变数据成员永远都不能为const,甚至当它是const对象的成员时也是如此,因此,const成员函数可以改变mutable成员,要将数据成员声明为可变的,必须将关键字mutable放在成员声明之前:

  • **
class Screen{public:private:   mutable size_t access_ctr;//可变的数据成员};
//我们给Screen添加了一个新的可变数据成员access_ctr。使用access_ctr来跟踪用Screen成员函数的频繁程度,const类型的成员函数能够修改private数据成员access_ctrvoid Screen::do_display(std::ostream & os) const{   ++access_ctr;   os<<contents;}
0 0