4 複製建構函式在不同編譯器中的表現

2021-09-29 22:11:52 字數 671 閱讀 1484

classaa

(const a & a )~a

()};

a f(

)int

main()

/*dev c++輸出結果:

1 constructor called

10 constructor called

10 destructor called

10 destructor called

visual studio輸出

結果:1 constructor called

10 constructor called

copy called //f()執行return語句時,在函式作用域之外建立乙個臨時物件,這個臨時物件用返回的物件進行初始化。這個臨時物件額建立就會導致複製建構函式被呼叫。臨時物件的值被賦值給a(這裡是賦值操作)。

10 destructor called //返回值臨時物件被銷毀

12 destructor called //由於執行過一次複製建構函式,因此原本的10被+了2。

12 destructor called //由於執行過一次複製建構函式,因此原本的10被+了2。

*/

這個例子說明dev出於優化目的並未生成返回值臨時物件。而vs無此問題。

編譯器合成複製建構函式

定義 只有單個形參,該形參是對本類型別物件的引用 常用const修飾 這樣的建構函式成為複製建構函式。使用方式 1 顯示使用 用乙個同型別的物件初始化該物件時 2 隱式使用 將該型別的物件傳遞給函式或從函式返回該型別物件時。三種型別的複製建構函式 bitwise copy constructor 逐...

編譯器角度看C 複製建構函式

關於複製建構函式的簡單介紹,可以看我以前寫過的一篇文章 複製控制之複製建構函式該文章中介紹了複製建構函式的定義 呼叫時機 也對編譯器合成的複製建構函式行為做了簡單說明。本文因需要會涉及到上文的一些知識點,但還是推薦先閱讀上文。本文主要從編譯器角度對複製建構函式進行分析,糾正以前對複製建構函式的一些錯...

(原創)後置 在不同編譯器中的行為

intx 0 x x 請問上述兩行 執行之後,x的值是什麼?有的同事說 1,有的同事說 0,究竟是什麼呢,試試就知道。試了三個編輯器,inter gcc和vc 自帶的cl inter 和gcc 得出的結果都是0,vc得出的結果是1。究竟哪個對呢?讓我們再看看那兩行 第一行不用多說,把乙個變數賦值為 ...