簡體   English   中英

聲明類成員函數

[英]Declaring Class Member Functions

我有一點C ++背景,但是只是進入該語言的面向對象編程方面。 我正在閱讀有關類格式的C ++教程網站。 我讀到有可能在類中聲明一個函數,然后使用范圍運算符::在類外定義一個函數。 鑒於我的經驗不足,我想知道是在類內定義函數是廣泛的首選,還是在類外定義函數是首選還是真的沒有關系。

從C ++教程網站

// classes example
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area() {return width*height;}
};

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

意思是,僅將set_values定義包含在類中會更緊湊,更有效嗎?

一如既往,謝謝。

通常,聲明位於.h文件中,而定義位於同名的.cpp文件中。

例:

rectangle.h:

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area() {return width*height;}
};

rectangle.cpp:

#include <rectangle.h>

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

這有助於在將您的代碼分發給其他人時。 您可以只分發.dll.h供他人使用,而將實際代碼保存在.cpp文件中。

.h文件開始增長時,它也很有用。 看到一千行的.cpp文件並不罕見。 僅為了找到該類的公共接口而經歷所有這些工作將花費很多精力。

注意: .h.cpp只是約定。 您可能會發現其他名稱,例如.cxx.inl (用於內聯函數)。

聲明內可以使用短方法。 通常,較長的方法最好與cpp文件中的其他方法一起使用。 Getter和Setter通常很短,因此在學習或調試其他更重要的方法時,某人(不是原始作者)不需要過多地關心它們。

這取決於您遵循的約定。

常見的約定是將getter和setter放在頭文件中,因為這些函數很可能經常被調用,因此應由編譯器內聯。 將函數放在頭文件中會鼓勵(但不能保證)編譯器執行此操作。

繼續,出於各種原因,應在.cpp中保留更長的聲明。 首先,如果您對.h進行了任何更改,它必須重新編譯包括該標頭的所有文件。 根據您的項目,這可能會花費大量時間。 其次,這提供了一種“隱藏”和專有代碼的方法,這些代碼要構建到庫中。 在這種情況下,並且是在良好編程習慣的最常見情況下,您希望頭文件為程序員提供指導,使他們可以快速查看類的功能,並根據注釋判斷如何使用該類。該類提供的功能。

在這種情況下,這實際上是個人選擇。 我會將函數放在類中,而不用擔心范圍解析。

范圍解析用於訪問具有相同名稱的局部變量和全局變量。

在C ++中,您通常將類定義放在頭文件(.h)中,並將成員函數的實現放在代碼文件(.cpp)中。 因此,在類定義之外實現函數是很常見的。 唯一顯着的例外是模板類的定義,其中完整的實現位於.h(甚至。)文件中。

這與其他編程語言(例如C#或Java)相反,它們不需要將此內容拆分為.h / .cpp文件,因為編譯器輸出包含所包含類的元數據,因此使.h文件作廢。

是的,如果類定義和實現位於同一個文件中,則它將更加緊湊。

但是通常您會將定義分為頭文件,將實現分為源文件。 這使您可以替換幕后實現,而不必更改定義並強制重新編譯類的客戶端。

此外,如果將實現和定義捆綁在一起,則包括標頭將導致實現被重復,從而導致輸出目標文件大得多,並且鏈接程序經常會因重復的名稱而產生爭議。

對於較小的方法,例如單個操作吸氣劑,尺寸影響最小。 通常,編譯器會放棄該方法,而直接訪問。

這絕對取決於偏好。 我絕對將實際功能始終保存在.cpp文件中,因為我想保持頭文件盡可能的干凈。 為了牢記OOP的要點,任何人都可以很好地了解此類的一般功能,將細節保留在頭文件中似乎比保留帶有聲明的函數並使整個文件很長的方法更好。並且很難獲得很好的概述。 但同樣,這實際上取決於偏好。

與Java和C#不同,通常的C ++做法是將類定義放在.h文件中,並將類成員函數的實現放入.cpp文件中。 這樣做有幾個原因。

  • 這增加了類的可讀性。
  • 如果您是庫開發人員,則通過在.cpp文件中分離代碼的實現,可以使庫易於分發。 如果希望將代碼用作其他幾個項目中的庫,則可以將已編譯的二進制文件(.a,.dll,.so或.dylib)與項目的頭文件一起分發。 這對於任何嘗試使用您的庫的人來說都很容易,並且幾乎在所有第三方庫中都可以使用它。

在頭文件本身中聲明短函數(通常不包含任何循環等)的情況也有一些例外,它們也以內inline函數為前綴。 這告訴編譯器優化給定的成員函數,並用內聯指令替換它們。 (更多關於內聯函數的好處在這里

暫無
暫無

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

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