2008-11-05 23 views
10

我經常遇到C++中的大型非模板類,其中簡單方法直接在頭文件的類體中定義,而不是在實現文件中單獨定義。例如:爲什麼C++方法有時在類中定義?

class Foo { 
    int getBar() const { return bar; } 
    ... 
}; 

爲什麼這樣做?這似乎有缺點。實現並不像應該那樣隱藏,代碼的可讀性較差,如果類的頭文件包含在許多不同的地方,編譯器的負擔也會增加。

我的猜測是人們打算將這些函數內聯到其他模塊中,這可以顯着提高性能。然而,我聽說新的編譯器可以在跨模塊的鏈接時進行內聯(和其他過程間優化)。對這種鏈接時間優化的支持有多廣泛,它是否實際上使這種定義成爲不必要的?這些定義還有其他什麼好的理由嗎?

回答

14

C++標準說默認情況下,類定義裏面定義的方法是inline。這爲簡單功能(如getter和setter)帶來明顯的性能提升。鏈接時跨模塊優化比較困難,儘管一些編譯器可以做到。

+1

是的,但「默認內聯」並不意味着編譯器會內聯它們,只是您不需要手動添加「內聯」關鍵字的*提示*。 – 2008-11-06 09:06:41

2

你回答了你自己的問題,他們確實是內聯方法。

使用它們的原因是性能。

+0

儘管如此,這並不意味着編譯器會內聯它們,只是你不需要手動添加「內聯」關鍵字的*提示*。 – 2008-11-06 09:07:33

7

通常沒有其他原因,除了它更簡單並節省時間。它也會在實現文件中保存一些混亂,同時在頭文件中佔用相同數量的行。如果僅限於獲得者和制定者之類的東西,那麼可讀性就會降低。

+0

不需要用繁瑣的代碼來混淆源文件。 – 2008-11-05 22:10:35

相關問題