關於g 中拷貝建構函式被優化的情況

2021-06-22 08:44:08 字數 1223 閱讀 9222

參閱如下**:

cat t1.cpp

#include #include using namespace std;

class a;

~a()

int i;

int a;

int j;

};a f()

int main()

編譯執行後發現如下問題:

1,f()函式返回時的拷貝建構函式沒有呼叫,導致main()函式中的b物件沒有得到預期值;

2,列印f()函式中的物件i和main()函式中的物件b,發現位址一致;說明整個程式中只產生了乙個物件。

con 2

in f():i addr is =796bb0

in main():b addr is =796bb0====i=1====j=2*****a=999

d

經過查閱網路資料,發現 

帖子也遇到了同樣的問題,並給出了答案,由於優化的原因,導致了函式f()的返回值被放到了呼叫方main中。

看看多個變數從f()中生成的情況,事實上變數都是在main()中:

#include #include using namespace std;

class a;

~a()

int i;

int a;

int j;

};a f()

a call_f()

int main()

./a.out

con 2

in f():i addr is =d774aae0

in caller ():c addr is =d774aae0

con 2

in f():i addr is =d774aad0

con 2

in f():i addr is =d774aac0

in main() i addr is d774aaec

in main():a addr is =d774aae0====i=1====j=2*****a=999

in main():b addr is =d774aad0====i=1====j=2*****a=999

in main():c addr is =d774aac0====i=1====j=2*****a=999dd

d

拷貝建構函式被呼叫的時機

拷貝建構函式被呼叫的時機 1.當用類的乙個物件去初始化該類的另乙個物件 或引用 時系統自動呼叫拷貝建構函式實現拷貝賦值。2.若函式的形參為類物件,呼叫函式時,實參賦值給形參,系統自動呼叫拷貝建構函式。3.當函式的返回值是類物件時,系統自動呼叫拷貝建構函式。下面給出乙個例子 cpp view plai...

關於C 中 thread 的拷貝建構函式

起因來自於 c 併發程式設計實戰 的這樣乙個例子 include include include class scropethread scropethread scropethread const scropethread delete scropethread operator const sc...

拷貝建構函式關於指標的拷貝問題

1.拷貝建構函式的定義 如果乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值。拷貝建構函式的第乙個引數必須是乙個引用型別。合成拷貝建構函式 如果我們沒有為乙個類定義拷貝建構函式,編譯器會為我們定義乙個。編譯器從給定物件中,依次將每個非static成員拷貝到正在建立的物件中。2.拷貝...