看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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)
bizza:謝謝你的詳細解釋,有種豁然開朗的fu~ ^^ 11/06 23:10