例:有乙個類a當這樣定義時
class aa
aa(const aa& a)
~aa()
aa& operator=(const aa&a)
};
其中函式如下,當呼叫test1時:aa f(aa a)
void test1()
執行結果如下
由此可見在這種情況下vs2013編譯器不會給予優化。
2. 有test2如下
void test2()
呼叫結果如下圖:
這邊是很奇怪了,這裡明明有個賦值函式為何卻沒有出現賦值函式的呼叫?
這裡就涉及到了編譯器對這個類的優化了,在函式f()中,返回了乙個aa型別的返回值,這個值被建立在了乙個專門儲存函式返回值的空間中,所以這裡返回乙個值後在賦值給乙個新構造的aa型別變數a2的過程中需要呼叫乙個無參的建構函式,乙個拷貝建構函式,還有乙個賦值函式,十分的繁瑣。所以編譯器將這個過程進行了簡化,省略了賦值和建立返回值的過程,直接將返回值拷貝構造給了需要構造的變數a2。
3.如果有test3如下又會輸出什麼樣的值呢?
void test3()
我們執行一下函式輸出的值如下:
這裡就很明顯,優化的過程和test2相似,並沒有更多的優化。
關於建構函式和析構函式的隱式呼叫
一 首先是最基本的呼叫 class test public test cout default constructor default constructor default destructor 二 在形參值傳遞時的呼叫 class test public test cout default co...
析構函式和建構函式的呼叫順序
先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成員類物件則...
建構函式和析構函式的呼叫順序
using system public class samplesarray public static class spublic static void c s 靜態類不能包含析構函式 public class apublic a a public class b apublic b b pub...