關於建構函式和析構函式呼叫時的多種情況

2021-08-05 18:19:31 字數 926 閱讀 8955

例:有乙個類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...