C++:拷贝构造函数

(一) 拷贝构造函数的调用

建一个包含拷贝构造函数的类

class A
{
public:
	A(){
		m_x=1;
		m_y=2;
	}
	~A(){}
	A(const A &obj){
		m_x=obj.m_x;
		m_y=obj.m_y;
		cout<<"调用拷贝函数"<<endl;
	}
private:
	int m_x;
	int m_y;
};

1、用一个对象初始化另一个对象

int main()
{
	A test;
	A test1(test);
	A test2=test;
	A test3=A(test);

	system("pause");
	return 0;
}

2、当函数形参是对象时

void printT(A test)
{
	cout<<"函数调用"<<endl;
}

int main()
{
	A test;
	printT(test);

	system("pause");
	return 0;
}

实参到形参的传递是一个拷贝的过程,对象作为形参时,可以使用指针或引用,避免调用拷贝构造函数。

函数返回一个对象时,会产生一个匿名对象,用返回对象对匿名对象进行初始化,调用匿名对象的拷贝函数。

(二)深拷贝,浅拷贝

浅拷贝

s1调用普通构造函数进行构造,对象s2使用s1对其初始化,会调用s2的拷贝构造函数,没有写拷贝构造函数会使用默认的拷贝构造函数,默认的拷贝构造函数知识对成员数据进行简单的复制,复制后的内存如图所示,指针指向堆上的同一个空间。

进行析构时,会先析构后构造的s2,这是s2指向堆内的空间,会将堆内的空间释放掉,而后释放s1,s1的数据成员指针也不为null,所以会去释放所指向的堆空间,但是这块空间已经被释放掉了,s1再次释放会发生错误。

深拷贝

各指向堆上的一段空间,不会影响。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值