1,臨時物件神秘在於不知不覺就請入程式當中,並且給程式帶來了一定的問題;
2,下面的程式輸出什麼?為什麼?
1 #include 23class
test411
12 test() //
這裡程式作者想要**復用,直接呼叫已經構造好的函式來完成沒有引數的建構函式的函式體;
1316
17void
print()
1821
};22
23int
main()
24
3,程式意圖:
1,在 test() 中以 0 作為引數呼叫 test(int i);
2,將成員變數 mi 的初始值設定為 0;
執行結果:
1,成員變數 mi 的值為隨機值;
4,建構函式是乙個特殊的函式:
1,是否可以直接呼叫?
1,給編譯器主動呼叫的,但也可直接手工呼叫;
2,是否可以在建構函式中呼叫建構函式?
1,從編譯器的編譯結果來看在語法上合法;
3,直接呼叫建構函式的行為是什麼?
1,直接呼叫建構函式將會產生乙個臨時物件;
1,是乙個合法的 c++ 物件,生命期只有一條語句時間;
2,過了這個語句臨時物件就會被自動析構而不復存在;
3,臨時物件是沒有名字的;
2,臨時物件的生命週期只有一條語句;
3,臨時物件的作用域只在一條語句中;
4,臨時物件是 c++ 中值得警惕的灰色地帶;
1,同 c 中的野指標一樣必須警惕;
5,避免因**復用呼叫建構函式而帶來的臨時物件的解決方案:
1 #include 23class
test
1011
public
:12 test(int
i) 13
1617
test()
1821
22void
print()
25};
2627
28int
main()
29
6,臨時物件的測試:
1 #include 23class
test
1011
public
:12 test(int
i) 13
1718
test()
1923
24void
print()
2728 ~test()
2932
};33
3435
intmain()
36
1,這裡僅是教育需要,向大家介紹這個知識點,在以後工程開發中,萬不可這樣寫**,一定要去避免臨時物件的產生和使用;
7,現代 c++ 編譯器在不影響最終執行結果的前提下,會盡力減少臨時物件的產生;
8,神秘的臨時物件程式設計實驗:
1,證明 c++ 編譯器在極力的減少臨時物件的產生;
1 #include 23class
test413
14 test(const test&t)
1519
20test()
2125
26int
print()
2730
31 ~test()
3235
};36
37test func()
3841
42int
main()
43
9,小結:
1,直接呼叫建構函式將產生乙個臨時物件;
2,臨時物件是效能的瓶頸,也是 bug 的**之一;;
1,c++ 中除了野指標,還有臨時物件;
2,工作中,如果出現了奇怪的問題,要從這兩個方面考慮;
3,現代 c++ 編譯器會盡力避開臨時物件;
1,避開的前提是不影響最終的執行結果;
4,實際工程開發中需要人為的避開臨時物件;
1,避免呼叫建構函式來初始化;
2,設計函式不要引入像 fun() 函式中的臨時物件;
C 中的臨時物件
我們知道在c 的建立物件是乙個費時,費空間的乙個操作。有些固然是必不可少,但還有一些物件卻在我們不知道的情況下被建立了。通常以下三種情況會產生臨時物件 1,以值的方式給函式傳參 2,型別轉換 3,函式需要返回乙個物件時 現在我們依次看這三種情況 一,以值的方式給函式傳參。我們知道給函式傳參有兩種方式...
C 中臨時物件的建立
在某些情況下,編譯器需要建立臨時物件。可能會出於下列原因建立這些臨時物件 使用乙個不同於所初始化的引用的基礎型別的型別的初始值設定項初始化 const 引用。儲存返回使用者定義型別的函式的返回值。僅當您的程式未將返回值複製到物件時,才會建立這些臨時記憶體。例如 複製udt func1 declare...
C 中關於臨時量和臨時物件
一 臨時量的生成 1 內建型別產生的臨時量 常量 不可更改 2 自定義型別產生的臨時量 變數 可以更改 3 隱式產生的臨時量 常量 二 返回值 1 返回內建型別的時候,產生的都是暫存器的立即數 2 返回自定義型別的時候,也是通過暫存器返回的,但是用指標或者引用來接收返回值時,編譯器會自動產生臨時量 ...