#include <iostream>
using namespace std;
class person {
public:
person()
{
;
}
person add(person p)
{
this->age += p.age;
return *this;
}
int age;
person(const person& p)
{
cout << "copy\n";
age = p.age;
}
~person()
{
cout <<"析构\n";
}
};
int main()
{
person a,b;
a.age = 10;b.age = 0;
b.add(a).add(a);
cout << b.age<<endl;
}
copy
copy
copy
析构
copy
析构
析构
析构
10
析构
析构
只有当初始化一个类时,才会调用拷贝构造函数(需要特别注意),当类与类间相互赋值时,不会调用拷贝函数,而是直接将类中所有成员变量直接赋值给另一个。
给函数的形参赋值时,可以看作类的初始化,这时可以将其看作person p=a;也可以用显示表示法看作person p= person(a);这样便会调用拷贝构造函数,创建一个匿名对象,如果有接收这个匿名对象的”真实“对象,便会进行直接赋值(也就是浅拷贝),此时匿名对象的生存周期与该”真实“对象同步了(也可理解为成为了同一个对象);如果没有能接收匿名对象,注意只有当匿名对象所在语句完全执行完成后,匿名对象才会销毁。
注意return person时,系统会自动创建一个匿名对象,相当于 person 匿名=*this;又会调用一次拷贝构造函数。
而链式函数的写法,如果是值传递,先从左至右依次执行一次,并先保留住结果(不执行函数内部),然后再从左至右执行一步函数内部内容,如果是引用,顺序操作一遍即可,不用操作两次。
#include <iostream>
using namespace std;
class person {
public:
person()
{
;
}
person& add(person p)
{
this->age += p.age;a.age +=20;
return *this;
}
int age;
person(person& p)
{
cout << "copy\n";
age = p.age;
}
~person()
{
cout <<"析构\n";
}
}a,b;
int main()
{
a.age = 10;b.age = 0;
b.add(a).add(a).add(a);
cout << b.age<<endl;
}
copy
copy
copy
析构
析构
析构
30
70
析构
析构
这里可以看出不是边赋值边执行,而是整体赋值完后再执行,因此a.age并没有实时改变,所以每次都加的是10,而不是10,20,30。
函数形参与类中成员变量同名时,注意用this指针区分。
只有初始化时,拷贝函数可能看自己有没有设置,别的时候都是把所有元素直接拷贝进来。