2010-04-03 71 views
10

我STUDING C++,我無法理解下面的黑體字句子的意思:C++,構造限制

IBM manual

以下限制適用於構造函數和析構函數:

  • 構造函數和析構函數沒有返回類型,也不能返回值。
  • 引用和指針不能用於構造函數和析構函數,因爲它們的地址不能被採用。
  • 構造函數不能用關鍵字virtual聲明。
  • 構造函數和析構函數不能聲明爲static,const或volatile。
  • 聯合不能包含具有構造函數或析構函數的類對象。

您能否給我舉個例子? 謝謝!

回答

24

該句子表示不能將指針指向構造函數或析構函數。這裏有一個例子:

class Sample{ 
    private: int x; 
    public: Sample() { x = 100; }; 
    public: void* member() { x = 200; }; 
}; 

template <class X> 
void call_me(Sample s, X function){ 
    (s.*function)(); 
}; 

call_me(s, &Sample::member); //valid 
call_me(s, &Sample::Sample); //invalid 
call_me(s, &Sample::~Sample); //invalid 

的理由是這樣的:

  1. 構造不返回任何東西(儘管它可以被認爲是返回一個初始化的對象的函數)。它作爲成員函數的返回類型是什麼?
  2. 構造函數並不是真正的成員函數,因爲它不能在對象上調用(如s.member())。
  3. 可能會爲每個構造函數和析構函數創建幾個實際函數。一個構造函數可能會分配內存,另一個可能不會(但仍以相同的方式初始化類成員)。一個析構函數可能會破壞基本子對象,另一個可能不會。在源代碼中的每個ctor/dtor調用中,編譯器選擇實際的「低級」ctor/dtor來調用;這個選擇是在編譯時進行的。如果通過指針調用它,則無法完成。
    很可能是什麼意思是「他們的地址不能被採取」。
11

您不能製作指向構造函數的函數指針(或引用)。

1

第一個猜測是你不能創建一個引用或指向構造函數/析構函數的指針。當然,在這種情況下(如果可能的話),「引用或指針」會引用成員或指向成員類型,因爲這些成員函數不是靜態的。然而,這個解釋有一個問題,原因之一是:在C++中,沒有像引用成員那樣的東西。

基本上,在這個解釋中提到的「引用」沒有任何意義:你不能引用任何類的非靜態成員函數,不管它是否是構造函數/析構函數或不。 C++中根本就沒有這樣的東西。

如果上面的解釋是正確的(其他的答案也建議),更有意義的(但仍然不太守)措辭會

  • 指針不能在構造函數和析構函數中使用,因爲他們的地址不能取。

在這種情況下提及「參考」是毫無意義的。

-1

他們不能是靜態的或虛擬的

+0

您可能需要詳細說明你的答案,因爲它現在說不是任何初學者很有幫助。 – 2014-01-23 09:03:16