6.3 临时性对象
如果有一个函数,形式如下:
T operator+( const T&, const T& );
以及两个T objects a 和 b,那么:
a+b;
可能会导致一个临时性对象,以放置传回的对象。是否产生临时性对象是根据编译器和操作发生时的上下文关系。
例如
T a,b;
T c=a+b;
有三种方式:
1、编译器会产生一个临时性对象,放置a+b的结果,然后再使用T的copy constructor,把该临时性对象当做c的初始值。
2、可能会直接以拷贝构造的方式,将a+b的值放到c中,于是不需要临时性对象,以及对其constructor和destructor的调用。
3、视operator+()的定义而定,named return value优化也可能实施起来,这将导致直接在上述c对象中求表达式结果,避免执行copy constructor和具名对象的destructor。
几乎所有的c++编译器保证任何表达式,如果有这种形式:
T c=a+b;
而其中的加法运算符被定义为:
T operator+(const T&,const T&);
// 或
T T::operator(const T&);
那么实现时根本不产生一个临时性对象。
而意义相当的assignment叙述句:
c = a+b;
不能够忽略临时性对象。它会导致下面的结果:
// T temp =a+b;
T temp;
temp.operator(a,b); // (1)
// c=temp
c.operator=(temp); // (2)
temp.T::~T();
标记为(1)的那一行,未构造的临时对象被赋值给operator+(),这意思是要么“表达式的结果被copy constructed 至临时对象中”,要么“以临时对象取代NRV”。
不管哪一种情况,直接传递c到运算符函数中是有问题的。由于运算符函数并不会为其外加参数调用一个destructor,所以必须在此调用之前先调用destructor。
// c = a + b; // c.operator=(a,b); 被取代
c.T::T~();
c.T::T( a + b );
///////////////////// 以下未整理 ///////////////////////////

浙公网安备 33010602011771号