值返回和指针返回简说
好吧,这是常识,我说快点。
C * c = get_c();
这是指针返回。
C c = get_c():
这是值返回。
指针返回的缺点是,你必须检测返回指针的有效性,也就是NULL。并且,你需要手工管理指针释放。而优点则是避免了值拷贝,还有可以返回空值,即通过返回NULL表示没有值的情况。
而引用返回最大的优势在于,变量的生存周期和作用域相同,你无需管理释放问题。然而缺陷就是庞大的拷贝开销。
在get_c返回的时候,会return一个对象。这个对象是子函数作用域对象(sub function scope),会随着子函数退出而失效。因此,在返回值的时候会引发拷贝。这种拷贝有两种可能。
- 拷贝构造
当返回值被用于某个对象的声明时,会触发拷贝构造函数。被返回的对象会作为拷贝构造参数传递(引用传递),而拷贝出的对象就是被生成对象。
- 赋值算子
即operator =。当对某个已经声明对象进行赋值时,会发生这种现象。
当然,近代编译器对于“在返回时进行构造用于返回后的构造”这种情况做了优化,通称RVO优化。例如上文,如果get_c中使用return C(a, b);进行返回,实际上只有C::C(a, b)的调用,而没有C::C(const C &
c)的调用。