CPeople people = CPeople::GetObject(),这个函数返回一个对象,为什么不调用拷贝构造 求大神 求大神,求大神
假设你用的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),两者的区别在于返回值是具名的局部变量还是无名的临时对象。
右值拷贝优化,当某一个类类型的临时对象被拷贝赋予同一类型的另一个对象时,通过直接利用该临时对象的方法来避免拷贝操作。
这项优化只能用于右值(临时对象),不能用于左值。
你先要看看是否编译器做了优化。然后还有一个rvo返回值优化的概念要看看。
是否有临时对象产生呢,你可以看看
调用的啊,怎么可能不调用
首先你要确定返回值是引用类型还是对象类型, 若是引用类型即使编译器不做任何优化,也不会在这一步调用拷贝构造函数。 若是对象类型的话同上
返回值是返回一个对象。在返回的时候,相当于创建了一个匿名对象(调用构造函数),出了函数作用域,匿名对象把它存放的数据进行其他运算。
这里不是用一个对象创建一个对象,而是用返回的值创建对象!
牢牢把握拷贝构造函数的定义