zoukankan      html  css  js  c++  java
  • 拷贝构造函数

    拷贝构造函数的调用

    四种情况下会调用拷贝构造函数
    1.初始化

    void main()
     
    {
     
        A a1;
     
        A a2 = a1;//调用copy构造函数
     
        a2 = a1;//浅copy,不会调用copy构造函数
     
    }
    

    2.初始化

    void main()
     
    {
     
        A a1;
     
        A a2(a1);//调用copy构造函数
     
    }
    

    3.函数值传递

    
    void f(A p)
     
    {...}
     
     
     
    void main()
     
    {
     
        A a;
     
        f(a);//a实参去初始化形参p,会调用copy构造函数
    
    }
    

    4.返回匿名对象

    
    A g()
     
    {
     
        A a;
     
        return a;.//先调用copy构造函数,用a对象创建了一个匿名对象;再执行a的析构函数(因为a为局部对象)
     
    }
     
     
     
    void main()
     
    {
     
        A a0;
     
        a0 = g();//匿名对象浅copy给a0,匿名对象被析构
     
        A a1 = g();//匿名对象直接去初始化a1,不会调用copy构造函数(此时c++编译器直接把匿名对象转成a1)
     
    }
    

    注意

    1. 只有一个对象对另一个同类型的对象进行初始化才会调用拷贝构造函数,但是匿名对象对另一个同类型的对象初始化不会调用拷贝构造函数,因为c++编译器对这种情况进行优化,直接将匿名对象转化为该对象,不需要进行额外的内存分配,提高了效率;

    2. 如果匿名对象对另一个同类型的对象赋值(非初始化),则匿名对象赋值给另一个对象后,匿名对象会被析构。

    3. 如果参数是引用传递,则不会调用任何构造函数;如果是按值传递,则调用复制构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行是存在,函数执行结束之后调用析构函数。

  • 相关阅读:
    LoadRunner的Capture Level说明
    LoadRunner Click&script 录制Tips
    LoadRunner虚拟用户协议脚本语言矩阵表
    LoadRunner 测试 AJAX
    如何创建自定义性能计数器
    8个批量样本数据生成工具
    JDBC性能优化
    使用Servlet为LoadRunner提供全局连续唯一数
    LoadRunner11测试Weblogic的问题
    如何让Fiddler捕获并记录HTTPS包?
  • 原文地址:https://www.cnblogs.com/hunter-w/p/13260159.html
Copyright © 2011-2022 走看看