前言
在学习黑马程序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 版权协议,转载请附上原文出处链接和本声明。