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



  • 相关阅读:
    ArrayList用法
    Delegate比较全面的例子(原创)
    一个登陆页面,包含了初始化用户,输入检测,错误处理等
    C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现
    ASP.Net防止刷新自动触发事件的解决方案
    存储过程编写经验和优化措施 (转)
    [转]数据库开发21条军规
    [转]Ajax简单客户登陆验证
    用SqlBulkCopy进行大批量数据迁移
    什么时候使用哪个数据绑定控件(asp.net)
  • 原文地址:https://www.cnblogs.com/aduck/p/2271043.html
Copyright © 2020-2023  润新知