關於拷貝構造隱式轉換和return時優化的一些思考

2021-07-29 13:29:17 字數 721 閱讀 3551

關於拷貝構造隱式轉換和return時優化的一些思考

#includeusing namespace std;

class a

a(int n)

a(a&a1)

a&operator=(a &a1)

private:

int a;

};a test1(a d)

a &test(a d)

int main()

如果函式返回值是乙個物件,要考慮return語句的效率,例如 (詳見優良的程式設計習慣)

return string(s1+s2);這是臨時物件的構造語法,表示建立乙個臨時物件並返回它 

效率明顯優於 

string res(s1+s2); 

return res; 

上述**將發成三件事情: 

1.res物件被建立,同時呼叫相應的建構函式完成初始化 

2.呼叫拷貝建構函式,把res複製儲存到返回值的外部儲存單元中; 

3.res在函式結束時被銷毀(呼叫析構函式); 

而第一種返回臨時變數的做法,編譯器直接把臨時物件建立並初始化在外部單元中, 

省去了拷貝和析構的開銷 

類似不要把 return(x+y);寫成 int temp=x+y; return temp;**會不易讀;

建構函式 建構函式隱式轉換 拷貝建構函式

建構函式對於我們來說是比較熟悉的,c primer裡提到 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,為 建構函式。例1 class fruit 定義乙個類,名字叫fruit 這樣的建構函式是我們比較常見的,但是如果變成 class fruit 定義乙個類,名字叫fruit 即使是乙個類...

建構函式隱式轉換

建構函式會引起乙個不引人注意的問題 用單個實參來呼叫的建構函式定義了從從形參型別到類型別的乙個隱式轉換。舉個例子說 cpp view plain copy class sales item sales item add sales item other sales item const std st...

C 轉換建構函式和隱式轉換函式

其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如 int a int 1.23 其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯 系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系...