簡體   English   中英

C ++類構造函數

[英]C++ class constructor

我有一個類的骨架,如下所示:

class MyList
{
    private:
    public:MyList(int);    // why can't I define stuffs here?
};

MyList::MyList(int s)     // why is this outside of the class?
{
}

我想知道為什么構造函數放在類本身之外? 將其放置在類本身中會不會更緊湊,更美觀?

如果需要,您絕對可以使構造函數內聯(“ Java樣式”),對於不太可能經常更改的簡單的單行方法,這通常是可行的方法。

您可能會問的問題是,允許非內聯版本進行內聯時有什么意義?

您可能有幾個原因想要做一個非內聯構造函數(或者實際上是任何方法的非內聯樣式):

  1. 由於.h文件被其他文件#included包含,因此,每次更改.h文件時,可能需要任何包含#h的.cpp文件(以及包含.h文件的.cpp文件和包含.h文件的任何.cpp文件)重新編譯。 如果您的程序很大和/或您需要大量更改內聯方法,這可能會使開發變慢。

  2. 將方法的主體與其定義分開,可以為您解決循環包含問題的方法 -例如,它將允許您擁有兩個類,其方法參數分別引用另一個類(通過指針或引用)。 僅使用內聯代碼,就必須在解析另一個類的.h文件之前解析這兩個類之一的方法主體,這很可能會導致“不完整類型”或“未知類型”的編譯錯誤。

我想知道為什么構造函數放在類本身之外?

函數定義可以放在外面,也可以放在里面。 這適用於所有成員函數,而不僅僅是構造函數。 因此,讓我讓您的問題更籠統:在類外部定義成員函數有什么好處?

它可以使類的定義簡短明了。 這對於保持類定義的可讀性很有用:成員聲明對於讀取其定義的類的用戶而言是最有用的信息。 成員函數的定義通常是一個不能或不應該依賴的實現細節。

它還允許在單獨的源文件中定義成員函數,而不是在內聯的所有源文件中內聯定義。

因此,優點與將自由函數的前向聲明與它們的定義分開一樣。 標頭中的函數聲明列表類似於簡潔的類定義,沒有內聯函數定義。

在其自己的源文件中而不是在所有源文件的內聯中離線定義函數(成員或其他)是很有用的,因為它允許單獨編譯單個源文件。 如果對該函數進行了任何更改,則無需編譯其他源文件。 在嵌入式情況下,所有使用該功能的源文件都必須再次編譯。 同樣,無論何時編譯任何其他源文件,都無需從另一個源文件編譯脫機函數,但是必須在每個源文件中編譯一個內聯函數。


這些一般優點幾乎不適用於您的瑣碎示例構造函數。 它是內聯定義的理想選擇,因為可以完全優化其調用。 而且,它太短了以至於不影響類的可讀性。 因此,我建議不要在類本身之外定義該構造函數。

您可以將構造函數定義放在類定義中。 兩種方式都像其他功能一樣工作。 放置位置取決於諸如定義長度之類的東西。

您可以將構造函數放在任一位置。 編譯器沒有區別。 但是,在團隊中遵循的慣例更多。 一些組遵循在* .cpp文件中定義所有內容的約定,從標准方法(例如構造函數,析構函數,復制構造函數,運算符重載,用戶定義的方法)開始。

它使代碼易於閱讀,並隨着代碼庫的擴展而得以維護。

暫無
暫無

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

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