拷贝构造函数调用原理

#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指针区分。

只有初始化时,拷贝函数可能看自己有没有设置,别的时候都是把所有元素直接拷贝进来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值