2011-06-10 139 views
4

我在開源庫中編程,在代碼中只有很少的註釋,並且絕對沒有代碼相關的文檔,或者顯示完全沒有或完全混淆的註釋。一個例子類的庫有時被定義如下(這是一個抽象簡單的例子):私人拷貝構造函數:disallow

class A 
{ 
    private: 

    // Disallow default bitwise copy construct. 
    A (const A& Acopy) { data = Acopy.data; }; 

    int data; 

    public: 

    A() {}; 

    A (int arg) : data(arg) {}; 

    A(const A& Acopy) { data = Acopy.data; }; 

}; 

私人拷貝構造函數的前「Dissalow默認按位拷貝構造」的評論就指出這樣一個事實當我定義一個類型時,我需要定義我自己的拷貝構造函數,以避免編譯器爲我「模糊生成」一個拷貝構造函數。這是我迄今在這個主題上學到的。但在這種情況下,構造函數是private,並且編譯以此形式中斷。

問:是否有這樣的理由?一個私人的複製構造函數?這個評論意味着什麼?

托米斯拉夫

回答

9

這意味着你說的非常多。通常,編譯器會生成一個拷貝構造函數。爲了防止這種情況,你可以定義你自己的,並將其設爲私人。然後,在編譯時複製構造類的任何嘗試都會失敗,而不是默默地做錯誤的事情。

+2

通常,複製構造函數只是聲明爲私有的,並未實現,賦值運算符接收相同的處理。罕見的情況是你不想公開復制構造函數,但私人構造函數是有意義的。 – AProgrammer 2011-06-10 07:57:18

+0

如果我定義了任何拷貝構造函數** private **或** public **,編譯器將不會生成一個。如果編譯器被賦予一個引用而不是一個值作爲參數,它將採用引用而不是值。如果它是私人的,它不能從課外被調用,其中兩個可能不存在。這是否意味着類的模板是這樣寫的,以迫使程序員定義他自己的公共副本(或私人)構造函數? – tmaric 2011-06-10 08:02:30

+1

不,當這樣寫時,它是*防止*課程被複制*完全*。一旦存在複製構造函數,就不能創建第二個構造函數。如果它是私密的,那麼它實際上意味着該類不能被複制。 – jalf 2011-06-10 08:06:27

2

通常,一個拷貝構造函數是由私人通過值來禁止對象的傳遞。

2

我認爲編譯打破了,因爲複製構造函數被定義了兩次,一次是私有的,一次是公有的。

私有拷貝構造函數的原因可能是爲了防止A的實例被值傳遞或返回。爲什麼要這樣做是另一回事,我無法回答。

2

正如你所說,要避免生成默認拷貝構造函數,但不僅僅是 - 它是private以避免實際使用它。讓它變得私密的一點是不允許使用它。

0

因爲您有兩個複製構造函數,一個是公共的,一個是私有的,所以編譯會中斷。私人複製賣家完全沒問題。他們不允許用戶可以做許多危險的事情。