C++day8 this指针(链式编程思想) 重要(注意看注释讲解)

在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;   
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值