在写代码的时候,发现了一个小问题:
例一:
#include <iostream>
using namespace std;
class Person
{
public:
int age;
Person(int age)
{
this->age=age;
}
Person addAge(Person &p)
{
this->age+=p.age;
return *this;
}
};
void test02()
{
Person p1(10);
Person p2(10);
cout<<p2.addAge(p1).addAge(p1).addAge(p1).age;
}
int main()
{
test02();
return 0;}
输出为40.
原因:类内函数addAge()是以值返回的,在难点五中已经说明,这种时机下拷贝构造函数会被调用,所以被返回的其实是另一个与p2现在值一样的变量,main函数中第一次p2.addAge(p1)返回一个p2’,p2’的age=20,再addAge(p1)一次返回一个p2’’,p2’‘的age=30,再来一次则返回p2’’’,p2’’‘的age=40。我们输出的相当于是p2’’’.age,所以正巧是40.
例二:
#include <iostream>
using namespace std;
class Person
{
public:
int age;
Person(int age)
{
this->age=age;
}
Person addAge(Person &p)
{
this->age+=p.age;
return *this;
}
};
void test02()
{
Person p1(10);
Person p2(10);
p2.addAge(p1).addAge(p1).addAge(p1);
cout<<p2.age;
}
int main()
{
test02();
return 0;}
输出为20.
原因:同上,类内函数addAge()是以值返回的,在难点五中已经说明,这种时机下拷贝构造函数会被调用,所以被返回的其实是另一个与p2现在值一样的变量,main函数中第一次p2.addAge(p1)返回一个p2’,p2’的age=20,再addAge(p1)一次返回一个p2’’,p2’‘的age=30,再来一次则返回p2’’’,p2’’‘的age=40。
但是与上面不一样的是,我们输出的是p2.age而非p2’’’.age,所以只能输出20.
例三:
#include <iostream>
using namespace std;
class Person
{
public:
int age;
Person(int age)
{
this->age=age;
}
Person& addAge(Person &p)
{
this->age+=p.age;
return *this;
}
};
void test02()
{
Person p1(10);
Person p2(10);
p2.addAge(p1).addAge(p1).addAge(p1);
cout<<p2.age;
}
int main()
{
test02();
return 0;}
输出为40.
原因:类内函数addAge()是以引用返回的,这种时机下不会调用拷贝构造函数,而是返回p2本身。main函数中第一次p2.addAge(p1)返回一个p2,p2的age=20,再addAge(p1)一次还是返回p2,p2的age=30,再来一次依旧返回p2,p2的age=40,最终main函数中输出p2的age。