您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记--复制构造函数

2011-12-01 18:40 253 查看
#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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: