簡體   English   中英

C ++基礎類布局

[英]C++ Basic Class Layout

學習C ++並看到如下所示的課程:

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
    int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}

我知道Java中的Java和方法(函數)是在類中編寫的。 該類看起來像Java接口。 我知道我可以寫這樣的類:

class CRectangle {
    int x, y;
  public:
    void set_values (int a, int b) {
      x = a;
      y = b;
    };
    int area () {return (x*y);}
};

但是有差異還是標准?

有區別。 在類定義(案例2)中編寫函數定義時,該函數被認為是inline聲明的。 這是標准的C ++。

用法,是在類定義中,在頭文件(.h)中聲明成員函數(Java方法),並在C ++文件(.cpp,.cc或.C,...)中定義這些成員函數。減少編譯時間,當您更改函數體時,只需編譯C ++文件,而如果更改​​頭文件中的某些內容,則將編譯包含此標題的所有C ++文件。

如果只在類定義中定義原型(屬於頭文件)並在cpp文件中實現方法,那就更清晰了。

當你有非常小的類時,在類定義中做所有事情可能聽起來更容易,因為一切都在同一個地方,但是一旦你的類增長,任何使用它的開發人員會討厭你,因為他會在方法原型之間使用你的代碼看看找出的東西(不是每個人都使用IDE來顯示所有可用的方法!)。

但是,有一個例外:模板類方法需要在頭文件中實現,因為它們需要針對模板的每個特化進行編譯。

通常的方法是將函數的實現放在一個單獨的cpp文件中,該文件不包含在其他文件中,只是編譯完成。 這樣,更容易管理依賴項。

如果在類定義中給出函數的實現(如在第二個示例中),這是編譯器內聯該函數的提示(它最終可能會或可能不會執行,具體取決於例如內部函數)。功能)。 根據經驗,長於幾行代碼的函數體最好放入cpp文件中,因為它們可能沒有內聯,但是這些可能包括額外的依賴性並使類定義混亂。

例外是模板函數,其中正文也需要在標題中,因為編譯器必須看到它們才能實例化模板。

我相信如果方法體在類定義中,那么它被內聯到它被調用。

在C ++中,類中定義的成員函數是隱式inline ,在類外定義的成員函數不是。

這會影響兩個示例的鏈接 - 如果第一個示例在多個源文件中包含#included ,則鏈接器會抱怨多個定義,而第二個示例則不會。

就標准/正常而言:

  • 第一種形式用於復雜類,其中函數的實現需要引入額外的頭。
  • 第二種形式用於沒有額外依賴性的簡單類。
  • 任何一種形式都用於基於開發者偏好的模板類。

在類中定義的函數是自動inline 后一個定義可以放在一個單獨的文件中。 否則沒有區別也沒有偏好。

請注意,我們通常不會在函數定義之后寫分號(盡管它們在類定義中是允許的)。

void set_values (int a, int b) {
  x = a;
  y = b;
} // no semicolon here

暫無
暫無

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

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