zoukankan      html  css  js  c++  java
  • 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()



  • 相关阅读:
    在平面中,一个点绕任意点旋转θ度后的点的坐标
    消息队列
    通过注册表修改默认打开方式
    Beagleboneblack的MLO文件干了些啥
    input子系统 KeyPad-Touch上报数据格式与机制
    字符编码
    find命令之exec
    Jmeter(一)-Linux上的安装和使用
    for循环删除linkedlist中的元素。。。。。。
    Java中组装String字符串常用的几种防范
  • 原文地址:https://www.cnblogs.com/aduck/p/2271043.html
Copyright © 2011-2022 走看看