2013-11-26 43 views
2

我是從一個基本的CPU仿真器閱讀一些C++代碼,我只是不明白這一點:私有拷貝構造函數與unamed參數?

class CPU { 
private: 
    CPU (const CPU&){} 
}; 

我明白三分,我還檢查了這一點:Ampersand & with const in constructor。顯然這是一個(硬)複製構造函數,但我不明白,這是如何工作的?爲什麼是const?爲什麼&符號到底沒有var名字?爲什麼私人?我還沒有在我的書籍或cplusplus.com中找到這樣的例子。

在一個側面說明:

int foo(int var) { cout << var; } 
int bar(int &var) { cout << var; } 

foo和bar打印同樣的事情?酒吧本質上是印刷* & var?

任何幫助表示讚賞!

回答

1

&指示在參數定義中使用時按引用傳遞。這將參數轉換爲一個指針,並在函數作用域內使用它時,將該指針取消引用。在第二個問題中,兩個函數都會打印相同的內容,因爲&只是說通過引用傳遞原始對象,而不是將其複製到函數頭中。相同的內容存在,唯一的區別是其中一個功能複製完整輸入,另一個可以編輯源變量(如果需要)。

CPU (const CPU&){}是說構造函數需要一個CPU對象的持續引用。這意味着您只能訪問CPU的常量函數(並且保證您不會更改原始CPU對象參數)。在CPU&之後沒有名稱僅僅意味着你沒有將變量賦值給當前範圍內的名稱(即在定義之後的括號將忽略參數)。

當一個構造函數是私有的時候,它通常意味着有另一個函數會爲你生成對象。工廠通常會在構建對象之前隱藏對象構造函數並需要其他一些屬性/註冊。

+0

因此,可以使用私人副本構造函數來控制實例的數量並防止複製實例?有趣。謝謝。 – ShadoWalkeR

0
  1. 常量,因爲你不修改要複製
  2. 符號的對象是指參考
  3. 沒有參數的名稱是允許在方法聲明,因爲只有類型的問題,不是名稱

最後是私有的 - 這個代碼只是「隱藏」從其他類複製構造函數,這意味着「不要複製我」。

3

不是工作。這裏的操作詞是private。整個構造所做的是創建一個只能從成員函數調用的複製構造函數,從而有效地禁用該行爲。通常人們會忽略掉函數體,這樣如果你從成員函數調用它,你也會得到一個鏈接錯誤。

在C++ 11的說法,這將被實現爲

CPU(const CPU&) = delete; 

如果你真的想說服它:

CPU x; 
CPU y(x); // this is the one that matches the parameters 

,你會得到一個編譯錯誤,因爲你不是一個成員函數,但你試圖調用一個私有函數。

他們這樣做的原因是因爲他們想要禁用的功能 - 您無法使用複製構造函數創建這些對象中的一個。

「const CPU &」表示「引用常量CPU」。將變量名放在合法的位置是合法的,因爲該函數不會引用它,但它必須與參數模式匹配。

+0

實際上,如果其他CPU方法使用拷貝構造函數,它就可以工作(雖然這不可能是這種情況) – Pyrce

+0

@Pyrce:這就是爲什麼通常沒有定義身體的原因。所以,如果意外使用,那麼你會得到一個鏈接器錯誤。但這就是爲什麼'= delete'更好,因爲你不必記住不定義它。 –

+0

你是什麼意思,它不起作用?它似乎是現有項目中的代碼,並且大多數C++項目仍然以C++ 03編寫最好的案例,這是從其他類隱藏拷貝構造函數的方式。 –

0

這是一種防止您(意外)通過e.q.創建類的實例的副本的方法。它傳遞給函數:

CPU foo; 
void f1(CPU &foo) {}; f1(foo); // work 
void f2(CPU *foo) {}; f2(&foo); // work 
void f3(CPU foo) {}; f3(foo); // fails 

所以,你將無法通過值功能,把它粘貼到電話。