簡體   English   中英

類成員函數聲明疑問

[英]Class member function declaration doubt

我正在閱讀C ++教程,我遇到了這句話:

在類中完全定義類成員函數或僅包含原型及其后來定義的唯一區別是,在第一種情況下,編譯器會自動將函數視為內聯成員函數,而在第二種情況下,它將是一個普通的(非內聯)類成員函數,實際上假設行為沒有區別。

我知道內聯函數是什么,我懷疑是選擇哪種樣式。 我應該在其類或外部定義每個函數嗎? 也許內部和外部最簡單的功能?
我擔心定義類中的每個函數(即具有復雜的內聯函數)可能會破壞生成的代碼並在執行期間引入調試問題或奇怪的行為。 最后,還有“編碼風格”問題。 所以,
哪種方法更好?

謝謝 :)

我的風格:我有時會在課堂上放置極短(一兩個班輪)的功能。 我仍然希望作為內聯函數的任何更長的內容在類定義之后作為inline限定實現,並且通常在單獨的文件中,在類定義的末尾添加頭#include

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

回答“哪種方法更好?” - 來自C ++ FAQ -

沒有簡單的答案:你必須玩它才能看到最好的東西。 不要滿足於簡單的答案,例如“從不使用內聯函數”或“始終使用內聯函數”或“當且僅當函數少於N行代碼時才使用內聯函數”。 這些一刀切的規則可能很容易記下來,但它們會產生次優結果。

這兩種方法本身都不是優先選擇和風格。 就個人而言,我一直認為在單獨的.inline文件中明確定義函數是最好的方法。 通過這種方式,您可以非常明確地了解自己的工作,並保持頭文件的清潔。

此外,如果您使用INLINE之類的宏,其定義如下:

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

然后,您可以在發布中的頭文件和調試中的CPP中包含內聯文件。 這意味着即使編譯器在調試中內聯函數,在調試時也不會有任何困難。 不可否認,這對於編譯器來說這不是一個問題,因此除非使用舊的編譯器,否則您可能希望跳過此操作。

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

例如,在類模塊中使用函數體有助於防止在類聲明不更改時(例如,只有成員函數體)對依賴模塊進行不必要的重新編譯。 這可以大大提高開發課程的效率。 一旦課程穩定,這就變得不那么重要了。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM