有关this的说明具体见《c++ Primer》
1、说明:类的成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。隐含形参命名为this,与调用成员函数的对象绑定在一起。成员函数不能定义this形参,而是由编译器隐含定义的。成员函数的函数体可以显示的使用this指针(访问数据成员),但是一般不必这么做。编译器在编译的时候会自动加上this指针,比如:object.printfInfo(int
a);相当于object.printfInfo(&objectm,int a); 这里的&object就是通过this指针引用的。
2、注意:由于this是对象所有,对于静态成员(成员函数和成员数据),是不存在this指针的。
3、使用场景:this指针主要用于返回对整个对象的引用,比如拷贝构造函数(还有比如对于某些类希望提供连续操作,如myScreen.move(4,0).set(“#”);移动光标然后设置显示字符等),需要返回整个对象的引用,就需要用到this指针。在成员函数中使用this指针返回对调用该函数的对象的引用。还有一种情况需要用到this指针,就是如果类的成员函数的形参命名和类的数据成员命名一样的时候,必须用this指针对类的成员数据赋值,这是由作用域决定的,在类的成员函数内部,形参(局部变量)作用域覆盖了类的成员变量的作用域。
4、this的生命周期
this指针在对象开始执行成员函数之前构造,在成员函数执行结束清除
5、 *this
*this含义:this就是一个指针,所以可以通过*this进行解引用来访问this指向的对象
#include <iostream> using namespace std; class Screen { public: Screen& move(int r,int c); Screen& set(char x); private: int r,c; }; Screen& Screen::move(int r,int c) { this->r=r; this->c=c; //do sth return *this; } Screen& Screen::set(char x) { //do sth return *this; } int main() { Screen scr=Screen(); scr.move(1,4); scr.set('a'); scr.move(2,4).set('a'); return 0; }
6、this与const
具体可以见const的用法
#include <iostream> using namespace std; class Screen { public: Screen(); Screen& move(int r); //移动 Screen& set(char x); //设置 const Screen& display() const; //const的display Screen& display(); //非const的display private: int r; //索引位置 char contents[100]; //内容 }; Screen::Screen() { for(int i=0;i<100;i++) contents[i]='/0'; } Screen& Screen::move(int r) { // this->r=r; return *this; } Screen& Screen::set(char x) { //do sth contents[r]=x; return *this; } const Screen& Screen::display() const { // r=9; cout<<"const display called"<<endl; return *this; } Screen& Screen::display() { //do sth cout<<"none const display called"<<endl; return *this; } int main() { Screen scr=Screen(); scr.display(); //right:调用非const的display scr.move(3); //right scr.display().move(4); //right:调用非const的display const Screen test=Screen(); test.display(); //right:调用const的display return 0; }