3

假設我有一類「MyClass的」 - :C++:與重載構造一個類對象的陣列

class myclass 
{ 
public: 
    int n; 
    myclass(int n=0) 
    { 
     this->n=n; 
    } 
    myclass(myclass &a) 
    { 
     this->n=a.n; 
    } 
    ~myclass() 
    { 
     cout<<n<<"\n"; 
    } 
}; 

現在我想創建「MyClass的」的對象的數組如下 - :

int main() 
{ 
    myclass arr[]= {5}; // Only 1 element for simplicity... 
} 

但是,當我這樣做,我碰到下面的錯誤 - :

在函數 '廉政的main()':
| 47 |錯誤:沒有匹配的福nction呼叫爲 'MyClass的MyClass的::(MyClass的)'
| 47 |注:考生:
| 36 |注:MyClass的MyClass的::(MyClass的&)
| 36 |注:沒有已知的參數轉換1從 'MyClass的' 到 'MyClass的&'
| 32 |註釋:MyClass的:: MyClass的(INT)
| 32 |注:沒有已知的轉換用於從 'MyClass的' 到 'INT'

參數1但是,當我從類刪除複製構造函數myclass(myclass &a),我沒有得到任何錯誤,一切工作正常...

所以現在我的問題是 - :

1)。這是爲什麼發生?是否myclass(int n=0)比複製構造函數更好匹配?

2)。如何成功編譯它,考慮到我希望這兩個,複製構造函數以及我的類中的整數構造函數?

注:我使用的GCC 4.7.3版本在Ubuntu 13.04

+1

複製構造函數不應該使用'const myclass&a'? – nvoigt

+0

@nvoigt兩者都是合法的,並且在極少數情況下(比如'std :: auto_ptr'),拷貝構造函數確實帶有一個非const引用。但通常情況下:您希望能夠複製臨時對象(這需要一個const ref),並且不要修改正在複製的對象(因此您可以使用const ref)。 –

回答

2

在這種情況下的初始化語義是複製 初始化。複製初始化正式轉換 爭議,然後複製它。轉換後的參數不是一個 左值,因此它不能綁定到您的 拷貝構造函數中的非常量引用。如果你沒有定義拷貝構造函數 ,那麼編譯器會爲你定義一個拷貝構造函數,它需要一個const 引用。你的拷貝構造函數也應該採用const 的引用,因爲它不會修改它的參數。

請注意,允許編譯器優化複製 構造。但是,只有當程序合法,如果它 沒有。

+0

我會投票贊成但我沒有足夠的信譽。我會盡快投票。無論如何,感謝您的幫助..! –

2

How to successfully compile it , considering I want both , the copy constructor as well as the integer constructor in my class?

添加const的拷貝構造函數修正的參考參數這個問題(如果是任何關係的。):

myclass(const myclass &a) : n(a.n) {} 

Demo on ideone

+0

噢!忘記了「5」是一個常量值。非常感謝! –

+1

@AnmolSinghJaggi'5'的類型是int,而不是'int const';這是一個右值,所以不能通過CV認證。 '5'作爲'myclass(int)'的參數。它是由'myclass(int)'創建的臨時對象的副本,如果複製構造函數接受非const引用,則它會失敗。 –

+0

@JamesKanze你是對的!但是,「cv-qualified」的意思是什麼? –