簡體   English   中英

副本分配運算符是什么?

[英]what is the copy assignement operator?

目前,我正在閱讀C ++ 11標准 ,其中提到了特殊成員函數中的(第12章) 轉讓運營商

我已經遇到過operator = ,它只是賦值運算符

我的第一個猜測是,它在這樣的語句中使用:

Class_name instance_name1 = instance_name2;   

當同時創建和初始化對象時,我檢查了我的假設,並通過復制構造函數完成了此工作(這是預期的)。

因此,使用什么作為副本分配運算符,如何聲明它,您能否給我一些使用它的示例。 提前致謝!

在標准12.8 / 17中定義:

用戶聲明的副本分配運算符X::operator=是類X一個非靜態非模板成員函數,具有恰好一個參數,類型為XX&const X&volatile X&const volatile X&

因此,例如:

struct X {
    int a;
    // an assignment operator which is not a copy assignment operator
    X &operator=(int rhs) { a = rhs; return *this; }
    // a copy assignment operator
    X &operator=(const X &rhs) { a = rhs.a; return *this; }
    // another copy assignment operator
    volatile X &operator=(const volatile X &rhs) volatile { 
        a = rhs.a; 
        return *this; 
    }
};

分配給對象時,將使用分配運算符。 您可能認為這沒什么大不了的,但是示例代碼Class_name instance_name1 = instance_name2; 沒有分配給對象,而是初始化一個。 區別在於語言的語法:在兩種情況下, =符號都在稱為“ 初始化子句”的內容之前 ,但Class_name instance_name1 = instance_name2; 是一個定義,而instance_name1 = instance_name2; 在定義instance_name1之后,它自己就是一個包含statement -expressionexpression-statement 賦值表達式使用賦值運算符,定義使用構造函數。

如果用於重載解決方案的通常規則選擇了一個分配操作符,即一個復制分配操作符,那么就使用了一個復制分配操作符:

X x;
x = 4; // uses non-copy assignment operator
X y;
y = x; // uses copy assignment operator

復制和非復制賦值運算符之間存在差異的原因是,如果您聲明一個復制賦值運算符,則會取消默認的復制賦值運算符。 如果聲明任何非副本分配運算符,則它們不會取消默認的副本分配。

在大多數情況下,它們是相同的。 從標准上來說,標准上說:

13.5.3分配[over.ass]

2)任何賦值運算符,甚至是復制和移動賦值運算符,都可以是虛擬的。

(史蒂夫的答案中的正確參考)

這使我們相信,賦值運算符可以存在而無需復制或移動。

給出的示例是:

struct B {
   virtual int operator= (int);
   virtual B& operator= (const B&);
};

這使我相信第一個是簡單的賦值運算符,而第二個是副本賦值運算符。 這也保留了復制構造函數使用的命名法。

因此,我想說一個復制賦值運算符是一個賦值運算符 ,它以相同類型的引用(或對象)為參數。

賦值運算符是= ,您可以像這樣重載它:

struct T
{
   T& operator=(const int&);
};

在這種情況下,我將其設置為int ,這是非常不尋常的,並且可能是不可取的。 通常,您編寫一個拷貝分配運算符 ,這意味着它引用了一個T

struct T
{
   T& operator=(const T&);
};

暫無
暫無

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

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