目前我正在阅读C++ 11标准,其中(第12章)提到了特殊成员函数?复制?分配经营者.
我已经面对operator =,这只是一个assignement运算符
我的第一个猜测是它用在这样的语句中:
Class_name instance_name1 = instance_name2;
Run Code Online (Sandbox Code Playgroud)
当一个对象被同时创建和初始化时,我检查了我的假设并通过复制构造函数(这是预期的)完成了.
那么,使用复制分配运算符的方法,如何声明它,你能给我一些它的用法示例.提前致谢!
它在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;
}
};
Run Code Online (Sandbox Code Playgroud)
分配给对象时使用赋值运算符.您可能认为这并没有多说,但您的示例代码Class_name instance_name1 = instance_name2; 未分配给对象,它初始化一个.不同之处在于语言的语法:在两种情况下,=符号都在一个名为initializer-clause的东西之前,但它Class_name instance_name1 = instance_name2;是一个定义,而instance_name1 = instance_name2;在定义之后,它本身instance_name1就是一个包含赋值表达式的表达式语句.赋值表达式使用赋值运算符,定义使用构造函数.
如果过载解析的通常规则选择作为复制赋值运算符的赋值运算符,则使用复制赋值运算符时:
X x;
x = 4; // uses non-copy assignment operator
X y;
y = x; // uses copy assignment operator
Run Code Online (Sandbox Code Playgroud)
复制和非复制赋值运算符之间存在区别的原因是,如果声明了复制赋值运算符,则会禁止使用默认复制赋值运算符.如果声明任何非复制赋值运算符,则它们不会禁止默认复制赋值.