通过传值方式返回创建的新对象时,使用一种特殊的语法.
例如在operator+
中:return Integer(left.i + right.i);
这种形式看起来像是一个构造函数的调用,这称为临时对象语法,含义是创建一个临时的Integer对象并返回它。
这种方式和创建一个有名字的对象并返回它是否相同呢?
例如:Integer temp(left.i + right.i); return temp;
这两条语句先创建temp对象,会调用构造函数。然后拷贝构造函数把temp拷贝到外部返回值的存储单元,最后在temp作用域的结尾时调用析构函数。
返回临时对象的方式不同与此:
当编译器看到这种语法时,会明白创建这个对象的目的只是返回它,所以编译器直接把这个对象创建在外部返回值的存储单元中,所以只需要调用一次构造函数,不需要拷贝构造函数和析构函数的调用。因此,使用临时对象语法的效率非常高,这被称为返回值优化。