2011-09-10 185 views
3

我在讀一本C++教程,我已經遇到了這樣的句子:類成員函數的聲明無疑

完全在它的類或定義一個類的成員函數 之間唯一的區別只包括原型和其後的 其定義是,在第一種情況下,函數 被編譯器自動認爲是內聯成員函數,而在第二種情況下它將是一個正常的(非內聯)類成員 函數,它實際上假設沒有行爲差異。

我知道內聯函數是什麼,我的疑問是關於選擇哪種樣式。我應該在課堂還是外面定義每個功能?也許內部和外部最簡單的功能?
我擔心定義類內的每個函數(即具有複雜的內聯函數)可能會混淆所產生的代碼,並在執行過程中引入調試問題或怪異行爲。最後,還有「編碼風格」問題。那麼,
哪種方法比較好?

謝謝:)

+0

從哪個角度看「更好」?我傾向於擔心代碼的讀者/維護者作爲第一個擔憂。除非另有說明,否則性能不太關注。 –

+0

@David Hammen:這是「編碼風格」問題。但是現在我是一個業餘愛好程序員,多年來這不會是一個問題;) – BlackBear

+1

從六個月以後,當你不能解讀你六個月前寫的內容時,這可能是一個問題。也許你自己的代碼中最重要的讀者是你自己。 –

回答

0

最好的解決方案是分離接口和實現。接口是你的h文件。只在那裏放置原型。實現轉到cpp文件。這種方法具有以下優點:

  1. 由於不需要多次編譯函數體,因此編譯速度更快。
  2. 標題依賴性更簡單,因爲不需要將所有標題包含在h文件中。某些頭文件僅在cpp文件中需要,您可以在h文件中使用前向聲明。你也可以避免循環依賴。
  3. 最後但並非最不重要的 - 人類更容易理解你的班級的界面。沒有代碼混亂。
0

要回答的一部分「哪種方法更好呢?」 - 從C++ FAQ -

有沒有簡單的答案:你玩它,看看有什麼是最好的。不要滿足於「不要使用內聯函數」或「始終使用內聯函數」或「使用內聯函數當且僅當函數少於N行代碼」的簡單答案。這些一刀切的規則可能很容易寫下來,但它們會產生次優的結果。

0

這兩種方法本身都是較好的,它是一個偏好和風格問題。就我個人而言,我總是認爲在單獨的.inline文件中明確定義函數是最好的方法。這樣你就清楚你做了什麼,並保持頭文件乾淨。

此外,如果你使用宏比如其定義如下INLINE:

#ifdef DEBUG 
    #define INLINE 
#else 
    #define INLINE inline 
#endif 

然後,您可以包括在釋放和從CPP在調試頭內嵌文件。這意味着即使編譯器在調試中內聯函數,調試時也不會有任何困難。無可否認,儘管如此,這對編譯器來說現在不是這樣的問題,所以你可能想跳過這個,除非使用舊的編譯器。

1

我的風格:我有時候會在課堂上加入極短的(一兩班輪)函數。任何我仍然想要作爲內聯函數的東西都會在類定義之後作爲inline限定的實現,並且通常在類別定義結尾處的標題爲#include的單獨文件中。

在類之外放置內聯函數的基本原理是,某些函數的實現通常會阻礙人類讀者對該類的整體理解。一個二十行的函數通常可以在一行註釋中進行彙總 - 並且該註釋是您在閱讀類定義時所需要的。如果您需要更多,請轉到函數定義,或者更好,請閱讀精細文檔。 (期待有人閱讀F ***代碼是精細文檔的一個可憐的替代品。)

0

一般來說,只有一個或兩個語句的成員函數可能是最好的,它的正文寫在類聲明—中,尤其是當它們中有很多時。具有超過20-50條語句的成員函數最好不在類聲明中。對於長度和複雜性,它取決於許多因素。

例如,在類聲明不改變成員函數體時,在類模塊中使用函數體有助於防止不必要地重新編譯依賴模塊。這可以在開發課程時大大提高生產力。一旦班級穩定下來,這就變得不那麼重要了。

相關問題