我的家庭作業是告訴我要聲明一個類內聯,但我只聽說過聲明函數內聯。內聯類聲明做了什麼,以及如何實現它?你如何聲明班級內聯?
回答
我認爲他們只是說,你的類應該在標題中去,爲方便起見,所有類方法應該在類中聯聲明,而不是把類方法外的線路或到一個單獨的CPP。
這是有些不明確,但是這就是我想解釋。
我究竟如何解釋它。但是,在上面的評論中「讓每個人的生活變得容易」並不是一個經驗法則。對於非常小的班級來說可能會更方便,但在大多數情況下並不適用。 – Correa 2012-03-03 19:10:59
比較函數和類:
一個函數可以有一個聲明和一個定義:
函數聲明給出了所有的信息需要的人誰想要調用的函數。
函數定義允許編譯器生成的機器代碼,這樣,當有人調用該函數會有說明在某個地方將要調用的可執行文件。
此生成的代碼只在可執行文件中存在一次。通常你可以把函數定義放在一個.cpp文件中(或者如果你使用C語言,這也適用於C語言),它被編譯並鏈接到可執行文件中。如果.cpp文件沒有鏈接,你會得到一個鏈接器錯誤,說FunctionName not found
或類似的東西。
如果你把函數定義在頭文件就非常有可能的是,頭會在你的系統中的多個地方使用,並納入其他.cpp文件更多。這會在鏈接時FunctionName already defined in this, that, or the other object file
產生相反的問題。
所以,平時沒有在頭文件中定義,因爲頭通常包括在多個cpp文件功能,以便最終將產生複製的對象代碼。
然而,它有些不同。你有兩種不同的方式來定義一個類的功能。一種方式是類似的運作方式上面的定義:
//myleanklass.h
class MyLeanKlass
{
public:
void perform();
};
//myleanklass.cpp
void MyLeanKlass::perform()
{
// Sing, dance, and play the piano
}
正如自由函數我們可以把定義在頭文件,只要它不超過一個.cpp文件包括。否則,我們會再次收到類似的鏈接器錯誤void MyLeanKlass::perform already defined ...
儘管這種情況並不常見。您通常會聲明類,以便可以通過系統重用它們。所以標題將被包含在多個地方並導致鏈接器錯誤。
只要是明確的,我們可能已經把在頭文件中的定義,但不inline
。您將無法在系統中多次包含此標頭:
class MyLeanKlass
{
public:
void perform();
};
void MyLeanKlass::perform()
{
// Sing, dance, and play the piano
}
最後,我們找到問題的答案。只要它們在類聲明中,就可以在頭文件中定義類函數。這被稱爲inline definition
。即使頭文件包含在多個.cpp文件中,也不會導致編譯單元中存在多個定義,並且不會導致鏈接器錯誤。
//myleanklass.h
class MyLeanKlass
{
public:
void perform()
{
// Sing, dance, and play the piano
}
};
不過,也有這種方法的問題:
- 內聯類的功能很可能使編譯需要更長的時間,因爲編譯器仍將編譯的類函數每重複定義,只有扔掉重複在鏈接時。
- 更改類功能會導致重新編譯包含它的任何.cpp文件,這又會導致更長的重新編譯時間。
- 有時候它是不可能的。如果一個類使用另一個類並且使用另一個類,那麼您將有循環依賴,並且不可能定義所有內聯。只需將問題函數放入單獨的.cpp文件即可解決問題。
- 1. PHP OOP聲明班級
- 2. 如何在班級內使用班級?
- 3. 你如何聲明一個謂詞委託內聯?
- 4. 如果內聯合聲明
- 5. 無法重新聲明班級Magento
- 6. List.AddRange內聯聲明
- 7. 如何讓Eclipse識別「內聯聲明」?
- 8. 如何顯式聲明內聯函數?
- 9. 班內的班級?
- 10. RegisterClientScriptBlock CDATA內聯聲明
- 11. 內聯結構聲明
- 12. Eclipse - 內聯開放聲明?
- 13. 內聯SQL更新聲明
- 14. 如何在班級內訪問我的班級變量?
- 15. 更新班級內的班級
- 16. Flash Builder:一個班級內的班級
- 17. 返回班級內的私人班級
- 18. 班級體內班級的Python名稱
- 19. 在班級內選擇班級
- 20. 製作班級內的班級
- 21. 如何在另一個班級內使用CSS樣式一個班級但不影響主班級班級
- 22. 如果其他內部聯合聲明
- 23. 你如何從另一個班級調用一個班級的方法?
- 24. Java中級聯泛型類型聲明
- 25. 進入聲明的級聯/追加
- 26. bash - 級聯案例聲明? (v。3.2.51)
- 27. 如何訪問班級中的班級
- 28. 客戶如何與我的班級圖中的其他班級相關聯?
- 29. 你如何延長級聯UI控件
- 30. 你如何閱讀C聲明?
你能發表整個問題嗎?老實說,「內聯課程」可能意味着不止一件事。比如,類中的類聲明或者函數內的類聲明(這兩個都可以完成並且有用例)。 – StilesCrisis 2012-03-03 19:02:32
@StilesCrisis「所有的表達式類聲明必須出現在一個名爲expressions.hh的頭文件中(你應該在這個頭文件中聲明所有的類,因爲這會讓每個人的生活變得更容易)。」 – 2012-03-03 19:03:20
我想他們只是說你的類應該放在頭文件中,爲方便起見,所有的類方法都應該在類本身中內聯聲明,而不是將類方法放在線外或放入單獨的CPP中。它有點含糊不清,但我就是這麼解釋它的。 – StilesCrisis 2012-03-03 19:05:25