通過傳值方式返回創建的新對象時,使用一種特殊的語法.
例如在operator+
中:return Integer(left.i + right.i);
這種形式看起來像是一個構造函數的調用,這稱爲臨時對象語法,含義是創建一個臨時的Integer對象並返回它。
這種方式和創建一個有名字的對象並返回它是否相同呢?
例如:Integer temp(left.i + right.i); return temp;
這兩條語句先創建temp對象,會調用構造函數。然後拷貝構造函數把temp拷貝到外部返回值的存儲單元,最後在temp作用域的結尾時調用析構函數。
返回臨時對象的方式不同與此:
當編譯器看到這種語法時,會明白創建這個對象的目的只是返回它,所以編譯器直接把這個對象創建在外部返回值的存儲單元中,所以只需要調用一次構造函數,不需要拷貝構造函數和析構函數的調用。因此,使用臨時對象語法的效率非常高,這被稱爲返回值優化。