2012-09-20 161 views
2

我感到困惑下,爲什麼它會調用第一個構造程序。爲什麼這個構造函數被調用?

class A 
{ 
public: 
     A(const char *c="\0") 
     { 
       cout<<"Constructor without arg"; 
     } 
     A(string c) 
     { 
       cout<<"New one"; 
     } 

}; 

int main() 
{ 
     A a="AMD"; 
     return 0; 
} 

輸出是 Constructor without arg

+0

爲什麼你有兩個構造函數,基本上做同樣的事情(接受一個字符串作爲參數)?讓調用者將參數轉換爲C或C++字符串,以便在這裏只需要一個構造函數。 – user1040229

回答

8

"AMD"const char[],這是隱式轉換爲const char*,所以第一個構造[A(const char *c="\0")]是最佳匹配。

注意A(const char *c="\0")不是構造不帶參數,這是一個構造函數接受一個const char*作爲參數,並具有在未指定const char*是使用一個可選的默認值。在這種情況下,你傳遞一個const char*,所以它使用它。

+0

等一下,所以'A a =「AMD」'和'A a(「AMD」)'是一樣的嗎? – Derek

+3

@Derek是的,初始化不是分配。 – pmr

+0

@pmr謝謝,我從來沒有見過任何人使用這種語法。 – Derek

0

你調用一個const char構造*因爲那是「AMD」是。這不是一個字符串。如果你把A a(字符串(「AMD」)),它將起作用。

1

由於文字串是const char[]類型隱含地轉換成const char*這是優選的在用戶定義的轉換std::string(const char*)的(這不是真正的string構造的對此的解釋簽名,但是足夠)。

另外:初始化不分配。這就是爲什麼一個構造函數而不是operator=首先被調用。

用於分配在C++ 11的優選語法爲A a{"ASDF"};。它使事情更加統一。

相關問題