this指针的概念(2)
我们知道,C++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生份函数实例,也就是说多个同类型的对象会共用一块代码(汇编角度看)
那么问题是:这一块代码如何区分是哪个对象调用自己的呢?
C++通过提供特殊的对象指针——this指针。可以解决上述的问题,this指针指向被调用成员函数的所属的对象。
这句话怎么理解呢?(每当我们创建一个对象的时候,编译器会自动提供一个this指针指向调用了类的成员函数的对象)
注意事项:
1.this指针是隐含在每一个非静态成员函数内的一种指针(也就是说静态成员函数内没有this指针)
2.this指针是不需要定义的,直接使用即可。
this指针的作用:
1.当形参和变量同名的时候,可用this指针来区分。
2.在类的非静态成员函数中返回对象本身,可使用return *this。
1 #include <iostream> 2 using namespace std; 3 4 class Person 5 { 6 public: 7 Person(int age) 8 { 9 //this指针指向被调用成员函数所属的对象 10 this->age = age; 11 } 12 13 Person& PersonAddPerson(Person &p) //引用返回 14 { 15 this->age += p.age; 16 17 return *this;//因为持续的追加,需要返回p2对象本身 18 } 19 20 int age; 21 }; 22 23 //1.解决名称冲突 24 void test_01(void) 25 { 26 Person p1(18);//this指向p1 27 cout << "p1的年龄" << p1.age << endl; 28 } 29 30 //2.返回对象本身,用*this 31 void test_02(void) 32 { 33 Person p1(10); 34 Person p2(10); 35 36 //如果想要实现年龄追加,需要修改被调成员函数的返回值 37 p2.PersonAddPerson(p1).PersonAddPerson(p1);//这种编程思想叫链式编程 38 cout << "p2的年龄 " << p2.age << endl; 39 } 40 41 int main(void) 42 { 43 //test_01(); 44 test_02(); 45 system("pause"); 46 return 0; 47 }
辨析:值返回和引用返回的细微差别。
1 Person PersonAddPerson(Person &p) //值返回 2 { 3 this->age += p.age; 4 5 return *this;//因为持续的追加,需要返回p2对象本身 6
值返回的时候,this->age = (p2.age + p1.age) + p1.age = 20;返回的*this只表示(p2.age + p1.age)中的p2.age ,因为this指向p2。
引用返回的时候,this->age = (p2.age + p1.age) + p1.age = 30;返回的*this表示(p2.age + p1.age)结果的地址。