C++中构造函数和析构函数

本文详细解释了拷贝构造与赋值构造的区别,并通过代码实例展示了它们在类对象创建过程中的作用。同时,通过一系列实验结果揭示了构造与析构过程中的顺序特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拷贝构造与赋值构造函数的区别:http://blog.youkuaiyun.com/sinhua_ren/article/details/1704884

classA a;

classA  b=a; 拷贝构造;相当于classA b(a) ,在声明的时候其实b还没有分配内存,所以b要构造

b=a;赋值构造--因为b已经有了,只是按照a来修改b中的内容而已

#include 
 
  

using namespace std;

static int static_index = 0;

class ParentA
{
public:
	ParentA(int a):index(a)
	{
		cout << "construct A " <
  
   << endl;
	}
	ParentA(const ParentA &pa)
	{
		index = ++static_index;
		cout << "copy construct A " << index << endl;
	}
	ParentA &operator=(const ParentA &pa)
	{
		index = ++static_index;
		cout << "= construct A " << index << endl;
		return *this;
	}
	~ParentA()
	{
		cout << "unconstruct A " << index << endl;
	}
	int index;
};

ParentA func(ParentA pa) {
	ParentA a(++static_index);
	return a;//先 拷贝构造新a,后析构旧a,析构pa,
}
void main(char **argv, int arg)
{
	ParentA pa(++static_index);
	func(pa);
	ParentA tmp2(++static_index);
	return;
}
  
 

结果:

construct A 1
copy construct A 2
construct A 3
copy construct A 4
unconstruct A 3
unconstruct A 2
unconstruct A 4  // 应为函数func(pa) 返回后没有用了,就里面析构了,在tmp2 (index=5)前面就析构了
construct A 5

unconstruct A 5
unconstruct A 1


如果 39行改为:ParentA tmp1=func(pa);

结果:

construct A 1
copy construct A 2
construct A 3
copy construct A 4
unconstruct A 3
unconstruct A 2
construct A 5

unconstruct A 5

unconstruct A 4  // 应为函数ParentA tmp1=func(pa) ; tmp1接收了,所以析构在tmp2(index=5)后面才析构
unconstruct A 1

从 index=4 可以看出构造和析构并不是完全 顺序相反对应(一般情况是相反对应的:先构造的实例后析构)


如果

void main(char **argv, int arg)
{
ParentA pa(++static_index);
ParentA tmp1=func(pa); // 这行与下一行 func(pa); 结果完全一样 ,tmp1 的index=4

// func(pa); // index=4;

return;
}

结果:

construct A 1
copy construct A 2
construct A 3
copy construct A 4
unconstruct A 3
unconstruct A 2
unconstruct A 4
unconstruct A 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值