C++类的this指针
这篇文章主要讲解隐式this指针的概念,以及如何使用,包含const 先直接给出一个C++Primer里的类,你可能还不能完全看懂,但是不着急,我们一点点解释 class Sales_data { std::string isbn() const { return bookNo; } Sales_data& combine(const Sales_data&); double avg_price() const; std::string bookNo; unsigned untis_sold = 0; double revenue = 0.0; }; //Sales_data非成员函数接口 Sales_data add(const Sales_data,const Sales_data&); std::ostream& print(std::ostream&,const Sales_data&); std::istream& read(std::istream&,const Sales_data&); 类的所有成员都必须在类内部声明,但是成员函数体可以定义在外部,比如我们上面写的Sales_data类,isbn函数定义在了内部,combine和avg_price函数定义在了外部 定义在类内部的函数是隐式的inline函数
”this“的概念我们先看isbn函数 std::string isbn() const { return bookNo; } 它的参数列表为空,返回一个string对象,那它是怎么知道这个string对象是来自哪个类的? this 先看一个调用的例子 total.isbn() 当我们调用成员函数时,实际上是在替某个对象(这里是total)调用它,isbn指向Sales_data的成员(bookNo),则它隐式地指向调用该函数的对象的成员 在 成员函数isbn又通过一个名为this的额外的隐式参数来访问调用它的那个对象(this其实就是指向当前对象的指针),当我们调用一个成员函数时,用该函数的对象地址初始化this,this就会指向当前对象 例如调用 std::string isbn() const { return this->bookNo } 因为this的目的总是指向”这个“对象,所以this是一个常量指针(这是一个顶层const,this指针本身就是常量) isbn() const首先你要知道const的基本用法,顶层cosnt和底层const如何区别,建议先阅读这篇文章,下面这几行代码方便你回忆起顶层cosnt int i = 0; int* const p1 = &i; //p1本身是常量,顶层const const int ci = 42; //ci本身是常量,顶层const const int* p2 = &ci; //*在const之后,p2是指向常量的指针,底层const const int* const p3 = p2; //先看左边是顶层,再看右边是底层,p3是指向常量的常量指针 const int& r = ci; //声明引用的const都是底层const,r是一个对常量的引用 好进入正题 先讲结论:" 首先我们忘掉isbn,默认情况下,this的类型是指向类类型的 非常量版本的 常量指针(这是一个顶层const,this指针自己是常量,但是它所指向的对象并不是常量),在Sales_data的成员函数中,this的默认类型是 尽管this是隐式的,但也遵循初始化规则,所以默认情况下我们不能把this直接绑定到一个常量对象上,同时也不能在一个常量对象上调用普通的函数成员(需要用到this) 具体来说,如果,我是说如果,如果isbn是一个普通函数没有const,this也是一个普通的指针,isbn内不会改变this所指的对象(只是返回bookNo),则我们应该把this声明成const Sales_data* const,所以把this设置为指向常量的指针可以提高灵活性 然而this隐式的,是不会出现在参数列表中的,所以在哪将this声明称指向常量的指针呢?C++的做法就是允许把const关键字放在成员函数的参数列表之后,就是我们看到的 //下面代码是非法的,只用于说明隐式的this指针如何使用,但我们不能显式定义this指针 //谨记此处的this是一个指向常量的指针,因为isbn是一个常量成员 std::string Sales_data::isbn(const Sales_data *const this){ return this->isbn; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |