什么是复制分配运营商?

spi*_*ght 1 c++ standards

目前我正在阅读C++ 11标准,其中(第12章)提到了特殊成员函数?复制?分配经营者.

我已经面对operator =,这只是一个assignement运算符

我的第一个猜测是它用在这样的语句中:

Class_name instance_name1 = instance_name2;   
Run Code Online (Sandbox Code Playgroud)

当一个对象被同时创建和初始化时,我检查了我的假设并通过复制构造函数(这是预期的)完成了.

那么,使用复制分配运算符的方法,如何声明它,你能给我一些它的用法示例.提前致谢!

Ste*_*sop 7

它在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)

复制和非复制赋值运算符之间存在区别的原因是,如果声明了复制赋值运算符,则会禁止使用默认复制赋值运算符.如果声明任何非复制赋值运算符,则它们不会禁止默认复制赋值.