欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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