C++ 中类的复制构造函数

声明:该文档如果引用,请注明出处;本人拥有最终解释权。

1、简单的复制构造函数的例子(建议自己先写一下结果,再看解析)

#include<iostream>
using namespace std;

class A {
public:
	int num;
	A();
	A(A& q);
	A& operator=(A& q);
	~A();
};
A::A() {
	cout<<"执行构造函数创建一个对象\n";
}
A::A(A& q) {
	this->num = q.num; 
	cout<<"执行复制构造函数创建该对象的副本\n"; 
}
A::~A() {
	cout<<"执行析构函数删除对象\n";
}

A func(A one);

int main() {
	A a;
	a.num = 100;
	cout<<a.num<<endl;
	func(a);
	cout<<a.num<<"errr"<<endl;

	return 0;
}
A func(A one) {
	cout<<one.num<<endl;
	return one;
}


解析过程:

1)A a ;  - - > 输出 执行构造函数创建一个对象;

2)cout<<a.num<<endl; - - >100;

3)func(a); = = >A func(A one) ; - - >执行A(A& q);即复制构造函数,生成“执行复制构造函数创建该对象的副本\n”;

4)A func(A one)    cout<<one.num<<endl; - - >100;

5)return one;- - >(重点) 生成一个临时的空间(复制构造函数的),输出“执行复制构造函数创建该对象的副本\n”,在复制结果后,首先结束的构造函数是one,输出“执行析构函数”

6)临时空间没有使用,“;”结束后,释放;(究竟那一步先释放,有争议,忘解答)

7)最后释放 A a;
结果:

2、为了验证上面的说法,下面的会复杂一点,我将部分解析:

#include<iostream>
using namespace std;

class A {
public:
	int num;
	A();
	A(A& q);
	~A();
};
A::A() {
	cout<<"执行构造函数创建一个对象\n";
}
A::A(A& q) {
	this->num = q.num; 
	cout<<"执行复制构造函数创建该对象的副本\n"; 
}
A::~A() {
	cout<<"执行析构函数删除对象\n";
}

A func(A one);

int main() {
	A a;
	a.num = 100;
	cout<<a.num<<endl;
	func(a),func(a);
	cout<<a.num<<"errr"<<endl;

	return 0;
}
A func(A one) {
	cout<<one.num<<endl;
	return one;
}

解析过程(以下我将主要解析func(a),func(a);这一过程):

1)func(a); = = >A func(A one) ; - - >执行A(A& q);即复制构造函数,生成“执行复制构造函数创建该对象的副本\n”;

2)A func(A one)    cout<<one.num<<endl; - - >100;

3)return one;- - >(重点) 生成一个临时的空间(复制构造函数的),输出“执行复制构造函数创建该对象的副本\n”,在复制结果后,首先结束的构造函数是one,输出“执行析构函数”

4)第二个和其相同,3——7、 8——11行解析清楚;

5)释放两个临时变量。输出12-13行。

结果:

3)下面的是关键步骤,个人觉得非常经典,如果上面没有阅读障碍的话,可以继续往下读,如果有,请原路返回。(注意比较第3和第4部分)

#include<iostream>
using namespace std;

class A {
public:
	int num;
	A();
	A(A& q);
	A& operator=(A& q);
	~A();
};
A::A() {
	cout<<"执行构造函数创建一个对象\n";
}
A::A(A& q) {
	this->num = q.num; 
	cout<<"执行复制构造函数创建该对象的副本\n"; 
}
A& A::operator=(A& q) {
	cout<<"赋值\n"; 
	return *this;
}
A::~A() {
	cout<<"执行析构函数删除对象\n";
}

A func(A one);

int main() {
	A a;
	a.num = 100;
	cout<<a.num<<endl;
	A b = func(a);//<==我们认为其可为 A b(func(a));
	cout<<a.num<<"errr"<<endl;

	return 0;
}
A func(A one) {
	cout<<one.num<<endl;
	return one;
}

解析过程:

我们试验后发现,A b = func(a); 它实际实现了这样的机制,它默认为这是一个复制构造函数的过程。

运行结果:



4)注意比较3和4的区别

#include<iostream>
using namespace std;

class A {
public:
	int num;
	A();
	A(A& q);
	A& operator=(A& q);
	~A();
};
A::A() {
	cout<<"执行构造函数创建一个对象\n";
}
A::A(A& q) {
	this->num = q.num; 
	cout<<"执行复制构造函数创建该对象的副本\n"; 
}
A& A::operator=(A& q) {
	cout<<"赋值\n"; 
	return *this;
}
A::~A() {
	cout<<"执行析构函数删除对象\n";
}

A func(A one);

int main() {
	A a,b;
	a.num = 100;
	cout<<a.num<<endl;
	b = func(a);
	cout<<a.num<<"errr"<<endl;
	return 0;
}
A func(A one) {
	cout<<one.num<<endl;
	return one;
}

运行结果:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值