2010-03-06 91 views
0

我剛剛發現我這樣的代碼不能正確編譯?這裏有沒有編譯器提供的構造函數?爲什麼這段代碼編譯不正確?

class A 
    { 

    private: 
     A(const A& n); 

    }; 


int main() 
{ 
     A a; 
} 

該錯誤是 TEST.CPP:18:錯誤:11:注:關於 ')A :: A(' 調用 TEST.CPP沒有匹配的功能候選是:A :: A(常量一個&)

我使用G ++的Ubuntu 8.04下

+3

什麼是錯誤? – 2010-03-06 05:39:24

+2

爲什麼這麼多的StackOverflow用戶質疑他們的問題標題中使用轉變? (標題編輯...) – 2010-03-06 05:41:40

+0

@jjj:沒錯,但大多數「問題標題」實際上不是標題,因此首字母的首字母大寫應該是合適的。我相信無論是句子還是標題樣式都適合,但是如果你懶得做任何一方,都會比我懶得回答這個問題.... :) – 2010-03-06 05:49:08

回答

7

編譯器爲您

  1. 默認的構造函數A()當且僅當該會提供再沒有用戶定義的構造,並
  2. 拷貝構造函數A(A const &)除非你要麼提供四種可能的拷貝構造函數A(A cv &),其中cvconstvolatile任意組合。

就你而言,你已經聲明瞭你自己的拷貝構造函數,這意味着編譯器將不會提供上述內容。

A a;需要一個可訪問的默認構造函數來編譯。

+0

哇......我以爲默認的構造函數會被提供。 ....因爲我剛剛提供了複製構造函數。我不知道默認的構造函數和拷貝構造函數是相關的。 – skydoor 2010-03-06 05:46:14

+0

對於C++來說,它們都是構造函數的形式,也是爲相應類型創建對象的一種方式。 – ardsrk 2010-03-06 05:49:24

+0

如果我只聲明一個操作符賦值,默認的構造函數會被隱式聲明嗎? – skydoor 2010-03-06 05:50:43

3

您在類A中聲明爲私有的構造函數是一個拷貝構造函數。

無論何時爲類提供參數化構造函數,C++都不會提供默認構造函數(一個不帶參數)。你必須顯式地爲你的類定義默認的類構造函數。