声明:该文档如果引用,请注明出处;本人拥有最终解释权。
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;
}
运行结果: