C++学习笔记--复制构造函数
#include <iostream>
#include <vector>
using namespace std;
struct Exmp1 {
//默认构造函数
Exmp1() {cout << "Exmp1()" << endl;}
//复制构造函数
Exmp1(const Exmp1 &) {cout << "Exmp1(const Exmpl &)" << endl;}
//赋值操作符
Exmp1 & operator = (const Exmp1 &rhc) {
cout << "operator = (const Exmp1 &)" << endl;
return *this;
}
//析构函数
~Exmp1() {cout << "~Exmp1()" << endl;}
};
void func1(Exmp1 obj) {}
void func2(Exmp1 &obj) {}
Exmp1 func3() {
Exmp1 obj;
return obj;
}
int main() {
Exmp1 oobj; //调用默认构造函数创建Exmp1对象oobj---输出Exmp1()
func1(oobj); //调用复制构造函数---输出Exmp1(const Exmpl &)
//将形参Exmp1对象创建为实参Exmp1对象的副本---输出
//函数执行完毕后调用析构函数插销形参Exmp1对象---输出~Exmp1()
func2(oobj); //形参为Exmp1对象的引用所以无需调用复制构造函数
oobj = func3(); //调用默认构造函数创建Exmp1对象---输出Exmp1()---输出Exmp1()
//函数返回时调用复制构造函数创建作为返回值副本的Exmp1对象---输出Exmp1(const Exmpl &)
//然后调用析构函数撤销局部Exmp1对象---输出~Exmp1()
//然后调用赋值操作符---输出operator = (const Exmp1 &)
//执行完赋值操作后,调用析构函数撤销作为返回值副本的Exmp1对象---输出~Exmp1()
Exmp1 *p = new Exmp1; //调用默认构造函数动态创建Exmp1对象---输出Exmp1()
vector<Exmp1> evec(3); //调用默认构造函数---输出Exmp1()
//创建一个临时值Exmp1对象
//然后3次调用复制构造函数,---输出3次Exmp1(const Exmpl &)
//将临时值Exmp1对象复制到,
//vector容器evec的每个元素,
//然后调用析构函数撤销临时值Exmp1对象
delete p; //调用析构函数撤销动态创建的Exmp1对象---输出~Exmp1()
return 0; //oobj和evec生命期结束,自动调用析构函数撤销
//撤销evec需要调用析构函数3次(因为evec有3个元素).但我的输出结果只有一次求解?!!!
}
//输出结果
Exmp1()
Exmp1(const Exmpl &)
~Exmp1()
Exmp1()
Exmp1(const Exmpl &)
~Exmp1()
operator = (const Exmp1 &)
~Exmp1()
Exmp1()
Exmp1()
Exmp1(const Exmpl &)
Exmp1(const Exmpl &)
Exmp1(const Exmpl &)
~Exmp1()
~Exmp1()