深刻浅出c++之---this指针

前言:C语言中的数组指针和指针数组c++

数组指针,是指向数组的指针的缩写;指针数组,是存放指针的数组的缩写。其实不少时候,每每由于简写和缩写带给咱们不少困惑。我曾想过不用简称去学习,但在不少时候,咱们查询的书籍文档和文章中仍是会频频出现这样的简称,因此有必要扣一下字眼了。数组

1     int *p[3];//[]优先级大于*,因此p是一个数组,数组中存放3个指向int的指针,这也就是指针数组。
2     int (*p1)[3];//先看括号,p1是一个指针,指向一个数组,数组的类型为int,这也就是数组指针。

不管在《c和指针》仍是《Effective C++》中,对于这样稍微复杂一点的表达式进行解释的时候,都告诉咱们先从变量名开始读,而后看变量名紧跟的运算符的优先级,便可完成解读。那么这和this指针有什么关系呢?关系就在于简称。函数

引用c++ primer中文版第五版上的原话:常量指针(const pointer)!当我第一次读到这里的时候,就以为怪怪的,常量指针究竟是指向常量的指针仍是指针自己是常量?(这一点尤其重要)很明显,根据英文const pointer显示做者想要表达的是这个指针是一个常量,也就是 T * const pointer,做为c语言的后续语言,我想在简称的时候也应该和c保持一致,const pointer简称为指针常量更好,T * const pointer 先找变量名pointer,往左读,const证实是常量,读完表达式,pointer指针是常量,简称指针常量更可取,为何呢?学习

数组指针,强调了这是一个指针,指向数组;this

指针数组,强调了这是一个数组,数组里面存的指针。spa

那么同理的话,常量指针,强调这是一个指针,指向常量;指针

指针常量,强调常量,表示这个指针是常量即const pointer。code

固然这是我我的从c过分而来并根据《c和指针》&&《Effective C++》上的习惯,你也能够像书上同样的简称,只要你明白具体的意思。可是最好使用的简称能快速反应出具体事实。就此,我认为该书此处释义有待商榷。对象

说完前言,回到正题------this指针。blog

引用c++ primer上的例子:

1  struct Sales_data{
2      std::string isbn() const {return bookNo}
3      ......
4      std::string bookNo;
5  };

isbn函数时如何得到bookNo成员所依赖的对象的呢?

例如咱们定义一个:Sales_data   total;

而后 total.isbn();当咱们调用成员函数时,其实是在替某个对象调用它。成员函数经过一个名为this的隐式参数来访问调用它的那个对象。当咱们在isbn函数中返回bookNo的时候,其实隐式执行了this->bookNo, 即total.bookNo。this顾名思义,就是“这个”的意思,谁来调用成员函数,this就指向谁的指针。

total.isbn(); 编译器等价地认为:Sales_data:: isbn(&total);编译器负责把total的地址传递给isbn的隐式形参this。在成员函数内部,咱们能够直接使用调用该函数的对象的成员,而无需经过成员访问符来作到这一点,由于this正是指向这个对象的。this形参是隐式的,任何自定义名为this的参数或者变量的行为都是非法的。由于this的目的老是指向“这个”对象, 因此this是一个常量指针 (这是书上原话,而通过我刚才的前言,这里改成指针常量更合适) 。 即,this是一个指针常量。这样理解后面的就轻松多了。

在上面的例子中,this的类型是Sales_data * const。尽管this是隐式的,但它也必须遵照初始化规则,默认状况下咱们不能把this绑定到一个常量对象上。c++中的作法是把const关键字放在成员函数的参数列表以后,此时紧跟在参数列表后面的const表示this是一个指向常量的指针。这样的函数也叫常量成员函数。即加了const在参数列表以后,this此刻的类型为const Sales_data *const。

到这里,之后本身写成员函数的时候就不会那么模糊了,首先明确this是一个指针,它自己是个常量,要想把一个常量绑定给this,咱们须要把这个this指针限定为常量指针(指向常量的指针)。那么,之后本身写成员函数时,就把它当作一个普通指针同样对待,那么,this将再也不迷糊。不须要指向常量就不在参数列表后加const,须要就加上const。

NOTE:

即便bookNo定义在isbn以后,isbn仍是可使用bookNo,编译器分两步处理类,首先编译成员的声明,而后才轮到成员函数体(若是有的话)。所以,成员函数体能够随意使用类中的其余成员而无须在乎成员出现的次序。

相关文章
相关标签/搜索