2010-08-28 133 views
3
//node.h 
class node 
{ 
     public: 
      void sort(node n); 

}; 

我還沒有試過這個代碼。但有趣的是要知道這是一個有效的案例,爲什麼?成員函數參數可以是相同的類類型嗎?

編輯:

這使我另一個問題: 我可以聲明這樣一個成員函數內FOO?

//FOO.h 
Class FOO 
{ 
    public: 
    void sort(int n) ; 
    void swap(int x , int y); 
} 

//FOO.cpp 

void FOO::sort (int n) 
{ 
    FOO obj; 
    obj.swap(3 , 5) ; 
} 
+1

爲什麼不呢? ______ – kennytm 2010-08-28 11:12:21

+0

因爲它屬於同一班級嗎?我看起來很奇怪。 – Ahmed 2010-08-28 11:14:24

+1

你純粹是想通過值作爲參數傳遞一個'node'還是會發現通過'node *'和'node&'奇怪? – Troubadour 2010-08-28 11:25:18

回答

4

現在確定您的問題僅與在會員中傳遞node有關(而不是通過node*node&),答案仍然是。你甚至可以在課堂內定義成員的身體是你所希望的。

至於爲什麼,從編譯器的角度考慮事情。因爲它解析類,所有它真正需要知道的是其中的數據成員以及函數成員簽名是什麼。在這一點上,沒有一個函數成員定義需要解析,所以編譯器在看到實際的node作爲論點的前景時不會感到驚慌。只有當它完成數據和簽名的解析後,它纔會返回並實際處理函數成員定義,並且在那一點上它確切知道什麼是node

在回答第二個問題時,您可以在成員中定義您的類的實例(出於同樣的原因)。

+0

現在,我明白了爲什麼它是可能的。好答案 。 – Ahmed 2010-08-28 12:16:26

2

是的,你可以。它是一個有效的案例。

你可以找到在C++標準庫的一些示例:

string& append(const string& str); 
+2

這不是在C++標準庫中:S這是一個多麼可怕的函數。 – 2010-08-28 11:22:28

+0

-1。 OP詢問了普通類型,而不是指針。 – 2010-08-28 11:42:56

+0

@philip,@Peter:謝謝,已編輯樣本。 – mhshams 2010-08-28 11:50:55

5

是的,這是完全有效的。如果你不能這樣做,你怎麼能寫複製構造函數?

一個類似的,但不是有效的情況是,包含與你的類/結構成員相同的類型。

struct Foo 
{ 
    Foo m_foo; 
}; 

你不能這樣做,因爲它本質上是一個圓形的定義,如果你有:

struct Foo 
{ 
    Foo m_foo; 
    Foo m_bar; 
}; 

然後一個Foo是2 FOOS,這將是4個FOOS,這將是8 Foos等這是沒有意義的。

可以,在另一方面,有指向相同的類型:

struct Foo 
{ 
    Foo* m_foo; 
}; 

因爲指針foo是不一樣的富。指針是一個指針,不管它指向什麼,所以沒有循環定義或依賴關係。

+0

+1擁有自己會員的好處。 – Skurmedel 2010-08-28 11:22:46

+0

您可以通過使用'const node&'而不是普通的'node'來編寫拷貝構造函數。 – 2010-08-28 11:43:59

+0

拷貝構造函數甚至不能通過值獲取參數! – UncleBens 2010-08-28 12:04:10

0

這是經常完成的。一個拷貝構造函數是一個很好的例子:

class Apple { 
public: 
    Apple(); 
    Apple(const Apple&); 
}; 
0

簡短的回答是肯定的:

長的答案是:

$ 92/2-「一個類在 類關鍵詞{ }中被認爲是一個完全定義的對象類型(3.9) (或完整類型)。在類 成員規範中,該類被認爲是 函數內完成 機構,默認參數和 構造函數構造函數,初始化 (包括嵌套 類這樣的事情),否則視爲自己的類 成員的規範內 不完整的「。

相關問題