推 bizza:謝謝你的詳細解釋,有種豁然開朗的fu~ ^^ 11/06 23:10
※ 引述《bizza ( )》之銘言:
: 想問的是,(1)解構子裡的輸出"Bye!"是怎麼出現的?
這程式碼裡面有四個 Stock 物件:
Stock(2, 2.)
Stock(10, 50.)
test1
test2
前面兩個沒有名字的是暫時物件. 正常情況下一樣會呼叫建構式和解構式.
你自己執行結果裡面唯一的 Bye! 是 Stock(10, 50.) 的解構式印的
而 codepad 裡面兩個 Bye! 的第一個是 Stock(2, 2.) 的解構式印的.
那為什麼你自己執行的不會呼叫 Stock(2, 2.) 的解構式呢?
因為當編譯器在處理 Stock test2 = Stock(2, 2.); 時,
可能因為 copy elision (一種最佳化的方法) 所以不會真的產生 Stock(2, 2.) 這個暫時物件
而是直接解讀成 Stock test2(2, 2.);
造成你自己執行的結果沒有呼叫到 Stock(2, 2.) 的解構式 (因為沒有真的產生過)
codepad 會出現第一個 Bye! 是因為 codepad 有開 gcc 的 -fno-elide-constructors
所以會乖乖的產生 Stock(2, 2.) 之後再複製給 test2
那因為 Stock(2, 2.) 被產生了, 死掉時就會呼叫解構式
: (2)但為何一樣的code,我卻沒有跑出這2個"Bye!"呢?
因為那兩個是 test1 跟 test2 的, 是在 main 結束時呼叫,也就是 system() 執行之後才會呼叫
我不確定你的 Dev C++ 版本是否會自動暫停。不然應該是因為視窗直接關閉看不到。
至於 codepad 裡面的話你把 system() 拿掉也會看到.
你現在看不到是因為 codepad 不讓你用 system(), 會強制中止程式
: (3)最後一題是19~24行的預設建構子,我把它刪掉,改把成員在private中宣告好
: [Warning] non-static data member initializers only available with -std=c++11
: or -std=gnu++11 [enabled by default]
警告訊息很清楚, 就是你這個寫法在 C++03 以前是不行的.
他叫你使用 -std=c++11
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.148
※ 編輯: Feis 來自: 140.112.29.148 (11/06 23:03)