簡體   English   中英

具有unamed參數的私有副本構造函數?

[英]Private copy constructor with unamed argument?

我正在從基本的CPU仿真器中讀取一些C ++代碼,但我對此一無所知:

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

我理解指針,我也檢查了一下: 構造函數中的&符號和const 顯然這是一個(硬)副本構造函數,但是我不明白,這是如何工作的? 為什么const? 為什么“&”號最后沒有var名稱? 為什么是私人的? 在我的書或cplusplus.com中找不到這樣的示例。

附帶說明:

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

foo和bar打印相同的東西嗎? bar本質上是打印*&var?

任何幫助表示贊賞!

工作。 這里的執行詞是private 整個構造所做的是創建一個只能從成員函數調用的復制構造函數,從而有效地禁用了該行為。 通常,人們會忽略函數主體,這樣,如果您從成員函數中調用它,也會得到鏈接錯誤。

在C ++ 11中,這將實現為

CPU(const CPU&) = delete;

如果您實際上試圖誘導它:

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

您將得到一個編譯器錯誤,因為您不是成員函數,而是試圖調用私有函數。

他們這樣做的原因是因為他們想禁用功能-您不能使用復制構造函數創建這些對象之一。

“ const CPU&”表示“引用const CPU”。 省略變量名是合法的,因為該函數從不引用它,但它必須匹配參數pattern

&表示在參數定義中使用時按引用傳遞。 這會將參數轉換為指針,並在函數范圍內使用該指針時取消對該指針的引用。 在第二個問題中,兩個函數都打印相同的內容,因為&只是說要通過引用傳遞原始對象,而不是將其復制到函數頭中。 存在相同的內容,唯一的區別是其中一個函數復制了完整的輸入,而另一個函數可以根據需要編輯源變量。

CPU (const CPU&){}表示構造函數需要對CPU對象的常量引用。 這意味着您只能訪問CPU的const函數(確保您不會更改原始CPU對象參數)。 CPU&之后沒有名稱只是意味着您沒有將變量分配給當前范圍內的名稱(aka定義后的括號將忽略該參數)。

當構造函數是私有的時,通常意味着有另一個函數將為您生成對象。 工廠通常會隱藏對象構造函數,並需要一些其他屬性/注冊才能為您構建對象。

  1. const,因為您不修改要復制的對象
  2. “&”號表示參考
  3. 方法聲明中不允許使用參數名稱,因為僅類型很重要,名稱不重要

最后是私有的-此代碼只是“隱藏”其他類的復制構造函數,這意味着“不要復制我”。

這是通過等價於將其傳遞給函數來防止(意外地)創建類實例的副本的一種方式:

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

因此,您將無法將其粘貼到按值調用函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM