2012-10-13 86 views
4

我想知道,當有人給你一個在C++中的默認構造函數的模板,並且在參數中有一系列未命名的變量以某種方式賦值。這是什麼意思? 這是合法的嗎? 如何訪問這些變量?構造函數參數中沒有名字的變量?

例子,我收到:

IntSet::IntSet(int = -1, int = -1, int = -1, int = -1); //default constructor 

我會明白,弄清楚這個使用任何答案!

+1

這是什麼語言? –

+0

這是針對C++的,我對沒有澄清這一點表示歉意! –

回答

1

這意味着如果您在不傳遞參數的情況下調用它,參數將採用您傳遞的值。

所以,如果你

IntSet* i = new Intset(); 

將相當於調用

Intset* i = new IntSet(-1,-1,-1,-1) 

關於無名的一部分。我會假設,因爲它是使用模板的庫的一部分。無名稱參數未被使用,但是它們與其他可能需要它們的類的簽名相匹配。在需要它們的情況下,它會默認傳遞-1。 你可以看看這個鏈接的例子:

http://compgroups.net/comp.lang.c++/unnamed-formal-parameter/1004784

我抄襲的例子從上面的參考這裏,以使案件在一個有用的方法

使用這樣的結構例如

class A 
{ 
    public: 
    A(void* = 0) {} // unused parameter 
}; 

class B 
{ 
    public: 
    B(void* p) : pp(p) {} // used parameter 
private: 
    void* pp; 
}; 

template <class T> 
class C 
{ 
public: 
    static T* create(void* p = 0) { return new T(p); } 
}; 

int main() 
{ 
    A* a = C<A>::create(); 
    B* b = C<B>::create("hello"); 
} 

ç::創建不會編譯除非A :: A的,即使不使用它 的參數。

+1

參數在聲明中可以是未命名的,如果它們在定義中被命名,它們仍然可以在定義中使用。標準中沒有任何內容說明參數名稱(如果有)必須在聲明和定義之間匹配。所有必須匹配的是簽名和返回類型。 –

+0

的確如此。我從來沒有說過這些名字必須匹配,對不起,如果我似乎暗示以其他方式。 我的意思是匹配另一個模板類的參數的類型和數量,作爲參考節目中的示例 – cloudraven

5

在聲明中或函數的定義中聲明參數是完全合法的。在聲明和定義中爲給定參數使用不同名稱也是完全合法的。

請注意,如果未在定義中命名的參數無法訪問。爲什麼要這樣做?很多編譯器都可以投訴未使用的參數。如果函數定義沒有命名這些未使用的參數,大多數編譯器都不會抱怨。

關於聲明中的未命名參數,這是此問題的主題:僅僅因爲這樣做是合法的,並不一定意味着這是一個好習慣。對於編譯器來說,函數聲明中的那些未命名的參數可能沒有問題,但它們對於讀者來說並不合適。沒有名字=零溝通。文檔和頭文件應該包含外部用戶需要知道的關於如何使用該類的所有內容。 RTFM和RTFH(閱讀精美的手冊/閱讀精美的標題)。 RTFM和RTFH中的「F」字(「精細」)在RTFC中具有不同的含義。

頭文件中的那些未命名的參數幾乎不可避免地與糟糕的文檔結合在一起。作爲外部用戶,這迫使我閱讀函數的定義以瞭解如何使用函數。 RTFC。當外部用戶必須閱讀執行以確定發生了什麼時,這並不好。