C++中this指针用作链式编程的实践

  • Post author:
  • Post category:其他




前言

在学习黑马程序C++教程时,看到第115集

https://www.bilibili.com/video/BV1et411b73Z?p=115

.时,听到this指针用作链式编程的例子,返回形式是引用形式还是值形式对结果有很大的影响,结合自己的理解和编程结果一探究竟。



代码实践

#include<iostream>
#include<string>
#include<vector>
#include<new>

using namespace std;


class Person {
public:

	Person(string name):name(name){}
	Person &PersonandPerson(Person &p)
	{
		this->name += p.name;
		//cout << "  1  " << endl;
		return *this;
	}

	string name;
	int a;
};

int main()
{
	Person p("张三");
	Person p2("饿了");
	Person p3("渴了");

	//p.PersonandPerson(p2).PersonandPerson(p2).PersonandPerson(p2);
	p.PersonandPerson(p2).PersonandPerson(p3);
	cout << p.name << endl;

	system("pause");
	return 0;
}

在上述的代码中,我们执行的是在成员函数中实现两个对象值相加的操作,当我们调用PersonandPerson()这个成员函数时,对两个对象中的name变量进行相加,并赋予调用的对象中的name变量,我们使用引用形式的返回,显然没啥问题,输出为:

在这里插入图片描述

下面我们删除引用标志,即为:

#include<iostream>
#include<string>
#include<vector>
#include<new>

using namespace std;


class Person {
public:

	Person(string name):name(name){}
	Person PersonandPerson(Person &p)
	{
		this->name += p.name;
		//cout << "  1  " << endl;
		return *this;
	}

	string name;
	int a;
};

int main()
{
	Person p("张三");
	Person p2("饿了");
	Person p3("渴了");

	//p.PersonandPerson(p2).PersonandPerson(p2).PersonandPerson(p2);
	p.PersonandPerson(p2).PersonandPerson(p3);
	cout << p.name << endl;

	system("pause");
	return 0;
}

结果为:

在这里插入图片描述

有点疑惑,结果和我们预期的有点不符,究竟是为什么呢,是因为只调用了一次吗,那我们在函数中添加一行输出看一看:

#include<iostream>
#include<string>
#include<vector>
#include<new>

using namespace std;


class Person {
public:

	Person(string name):name(name){}
	Person PersonandPerson(Person &p)
	{
		this->name += p.name;
		cout << "  1  " << endl;
		return *this;
	}

	string name;
	int a;
};

int main()
{
	Person p("张三");
	Person p2("饿了");
	Person p3("渴了");

	//p.PersonandPerson(p2).PersonandPerson(p2).PersonandPerson(p2);
	p.PersonandPerson(p2).PersonandPerson(p3);
	cout << p.name << endl;

	system("pause");
	return 0;
}

在这里插入图片描述

两个“1”都被打印出来,表示函数确实被调用了两次,没啥问题,原因只能有一个:第二次调用的没赋给p这个对象。

调用成员函数时,我们自左往右进行逐次调用,调用第一次后,返回的不是p本身,而是p的一个拷贝,在调用一次后,就和p没啥关系了,所以第二次是以p的拷贝进行调用,生成另一个拷贝。其实要得到我们想得到的结果很简单,我们可以这样做:

#include<iostream>
#include<string>
#include<vector>
#include<new>

using namespace std;


class Person {
public:

	Person(string name):name(name){}
	Person PersonandPerson(Person &p)
	{
		this->name += p.name;
		cout << "  1  " << endl;
		return *this;
	}

	string name;
	int a;
};

int main()
{
	Person p("张三");
	Person p2("饿了");
	Person p3("渴了");

	//p.PersonandPerson(p2).PersonandPerson(p2).PersonandPerson(p2);
	Person p4 = p.PersonandPerson(p2).PersonandPerson(p3);
	cout << p4.name << endl;

	system("pause");
	return 0;
}

输出为:

在这里插入图片描述

这就得到我们想要的结果了,不过这和p本身没啥关系了,所以这就是使用引用返回的妙处。



版权声明:本文为qq_36763031原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。