[英]hide auto generated assignement operator and copy constructor without replacing them
[英]what is the copy assignement operator?
目前,我正在閱讀C ++ 11標准 ,其中提到了特殊成員函數中的(第12章) ? 轉讓運營商 。
我已經遇到過operator = ,它只是賦值運算符
我的第一個猜測是,它在這樣的語句中使用:
Class_name instance_name1 = instance_name2;
當同時創建和初始化對象時,我檢查了我的假設,並通過復制構造函數完成了此工作(這是預期的)。
因此,使用什么作為副本分配運算符,如何聲明它,您能否給我一些使用它的示例。 提前致謝!
在標准12.8 / 17中定義:
用戶聲明的副本分配運算符
X::operator=
是類X
一個非靜態非模板成員函數,具有恰好一個參數,類型為X
,X&
,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 -expression的expression-statement 。 賦值表達式使用賦值運算符,定義使用構造函數。
如果用於重載解決方案的通常規則選擇了一個分配操作符,即一個復制分配操作符,那么就使用了一個復制分配操作符:
X x;
x = 4; // uses non-copy assignment operator
X y;
y = x; // uses copy assignment operator
復制和非復制賦值運算符之間存在差異的原因是,如果您聲明一個復制賦值運算符,則會取消默認的復制賦值運算符。 如果聲明任何非副本分配運算符,則它們不會取消默認的副本分配。
在大多數情況下,它們是相同的。 從標准上來說,標准上說:
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.