wei12345645 2016-05-28 04:53 采纳率: 0%
浏览 2460

c++中返回值是对象,为什么不调用拷贝构造

CPeople people = CPeople::GetObject(),这个函数返回一个对象,为什么不调用拷贝构造 求大神 求大神,求大神

  • 写回答

6条回答 默认 最新

  • 小灸舞 2016-05-28 13:20
    关注

    假设你用的VS,同样的程序在DEBUG下会调用拷贝构造,而RELEASE下却不会(因为被优化了)
    给楼主写了个例子:DEBUG模式下调用fun1结果会多一句copy constructor,而RELEASE模式下则没有copy constructor(显然是被优化掉了)

     #include <iostream>
    using namespace std;
    
    class Test
    {
    public:
        int a;
        Test()
        {
            cout<<"default constructor"<<endl;
        }
    
        Test(int x)
        {
            cout<<"the constructor with parameters"<<endl;
            this->a=x;
        }
    
        Test(const Test &test)
        {
            cout<<"copy constructor"<<endl;
            this->a=test.a;
        }
    };
    
    Test fun1()
    {
        Test t;
        cout<<"fun1"<<endl;
        return t;
    }
    
    int main()
    {
        Test test1;
        Test test2=fun1();
    }
    

    为避免对临时对象进行不必要的拷贝,C++编译器常使用一种名为Copy Ellision(拷贝去除)的优化技术,该技术至少包括以下两项内容:
    返回值优化(RVO),即通过将返回值所占空间的分配地点从被调用端转移至调用端的手段来避免拷贝操作。
    返回值优化包括具名返回值优化(NRVO)与无名返回值优化(URVO),两者的区别在于返回值是具名的局部变量还是无名的临时对象。
    右值拷贝优化,当某一个类类型的临时对象被拷贝赋予同一类型的另一个对象时,通过直接利用该临时对象的方法来避免拷贝操作。
    这项优化只能用于右值(临时对象),不能用于左值。

    评论

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿