Re: [問題] 關於inline與class的問題

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間17年前 (2009/04/13 19:01), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《zesiva (呼拉拉)》之銘言:

04/13 16:56,
請問那是因為是class裡面的func才有這種限制嗎
04/13 16:56

04/13 16:56,
若不在class裡面的func要inline也要定義在.h嗎 謝謝
04/13 16:56
是的。 請回想一下 inline 的作用:在呼叫端直接展開 function 的內容。 inline int f(int i) { return i+1; } int XXX() { int x = 10; int y = f(x); // compiler 在這邊把 f(x) 直接代換成 x+1 } 你可以想像一下,如果 .h 中沒有 f() 的內容 { return i+1; } 那呼叫 f(x) 的時候,compiler 要把它代換成什麼? 推 QQ29:請教一下 為什麼你沒去呼叫他就沒事 呼叫了才說 無法解晰的 04/13 17:05

04/13 17:06,
外部符號呢? 可以講一下原理嘛@@
04/13 17:06
因為沒有呼叫時,compiler 就不會產生對應的 assembly code, 因此編譯出來的 object file 中並不會參照到這個實際上沒定義的 symbol, 這樣的 object file 可以順利連結執行,linker 也不需要報錯。 建議去找一些 assembler/linker 如何運作的相關資料,會了解比較透澈 (如 computer organization 的書) 這種「呼叫才會報錯」的現像可以引出一些小技巧,比如說 class T { public: explicit T(int i) : data(i) {} private: T(); // default ctor,宣告但不定義 T(const T&); // copy ctor,同樣宣告但不定義 T& operator=(const T&); // 同上,宣告但不定義 int i; }; 這個 class 這樣寫的目的在於要求使用者一定要用 int 作為參數來建 構 T,而不能使用 default 或 copy constructor。同時它也禁止使用 者用等號來直接複製物件。需要注意的是,如果我們不寫 default/copy constructor 或 operator=,compiler 會自動幫我們生一個出來,而不 知情的使用者將會用得很愉快。為了避免這種情況,我們把它宣告在 private 區域中。 然而如果我們同時又提供了這些 function 的定義,那麼在 T 的 friend 或是 public derived class 中又可以順利呼叫這些 function。因此這 邊的作法是提供宣告但不給定義,若它們被其它 function 呼叫時,linker 就會顯示錯誤訊息。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.117.50

04/14 09:51, , 1F
非常感謝詳細解答 受益很多
04/14 09:51, 1F
文章代碼(AID): #19unkVBs (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19unkVBs (C_and_CPP)