C++day8 this指针(链式编程思想) 重要(注意看注释讲解)
程序员文章站
2022-03-05 23:29:19
...
在C++中成员变量和成员函数是分开存储的
而每一个非静态成员函数只会产生一份函数实例,也就是说多个同类型的对象会共用一块代码,那么代码是如何区分是哪个对象在调用?(如p1,p2,p3都在用)
this指针:指向被调用的成员函数所属的对象(如p1调用成员函数,this指向p1)
隐含在每一个非静态成员函数内的一种指针,不需要定义直接使用即可
用途
- 当形参和成员变量同名时,可用this指针区分(成员属性前加this->)注意代码中的注释
class person
{
public:
person(){}
person(int age)
{
//this指针指向 被调用的成员函数 所属的对象,这里person构造函数是被调用的函数,这个成员函数是p1
//在调用,所以所属对象为p1。因此this->age是p1对象的age,最后输出时被赋值点的yeship1.age
this->age = age; //形参和成员变量同名,,需在类成员变量前加this->,才能接收数据并赋值
}
int age;
};
void test()
{
person p1;
person p2(18); //这里所属对象为p2,所以p1.age没有值
cout << p1.age << endl;
}
int main()
{
test();
system("pause");
return 0;
}
注意:这里将this->替换为person::也行
class person
{
public:
person(){}
person(int age)
{
person::age = age; //这里的person::辨明在person这个作用域下的age,和传输过来的形参age做了区分
}
int age;
};
void test()
{
person p1(16);
person p2(18); //这里所属对象为p2,所以p1.age没有值
cout << p1.age << endl;
cout << p2.age << endl;
}
- 在类的非静态成员函数返回对象本身,可用 return *this(115课)
因为this实际上是一个指针,所以*this即是指向对象的本体(this有点像特殊的指针变量p)
又因为此处返回的是对象本体,所以必须是person &(以引用的方式返回)
总结:return *this返回的是当前对象的克隆或者本身(若返回类型为A, 则是克隆, 若返回类型为A&, 则是本身 )。return this返回当前对象的地址(指向当前对象的指针)
C++中的this和*this_github_38384969的博客-CSDN博客_c++的*this联动理解
this是指针,*是解引用,则*this
就很好理解了,就是指针的内容,即对象本身,p2所命名的那块地址
person &*this = p2
*this为p2的别名,所以这里返回的还是p2所开辟的那块地址,不是复制后新开辟的地址
总结:主要是看返回的地址变没有。如果没加&,就是拷贝后新开辟的地址,创建了一个新的对象,不再是this所调用函数所属的对象了(理解)
class person
{
public:
person(){}
person(int age)
{
person::age = age; //这里的person::辨明在person这个作用域下的age,和传输过来的形参age做了区分
}
person & personadd(person &p) //因为引用相当于起别名,这里相当于int &b = a
//只有以引用的方式返回,才能返回本体,不然只是个复制体
//person &*this = p2
//*this为p2的别名,所以这里返回的还是p2所占得那块地址,不是复制后新开辟的地址
//可继续p2.personadd(p1)
{
this->age += p.age;//将传进来的数加到自身上
//因为this是一个指向p2的指针,所以*this指向的是p2的内容,即p2这个对象本体
return *this; //这里返回的是p2那块地址的内容,即p2本体或其复制体
}
int age;
};
void test()
{
person p1(16);
person p2(18);
//链式编程思想
p2.personadd(p1).personadd(p1);//这里p2.personadd(p1)返回的是一个p2就可以再次调用personadd(p1)
//所以调用函数的返回必须是一个对象
cout << p2.age << endl;
}
int main()
{
test();
system("pause");
return 0;
}
上一篇: JSON对象操作