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()



原文地址:https://www.cnblogs.com/aduck/p/2271043.html