什么是复制赋值运算符?

时间:2012-11-07 10:25:56

标签: c++ standards

目前我正在阅读 C ++ 11标准,其中(第12章) amoung特别会员功能是 ?copy?分配运营商

我已经面对operator = ,这是简单的assignement运算符

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

Class_name instance_name1 = instance_name2;   

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

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

3 个答案:

答案 0 :(得分:7)

它在标准中定义,12.8 / 17:

  

用户声明的 copy 赋值运算符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; 不会分配给对象,它会初始化一个。区别在于语言的语法:在两种情况下,=符号都在称为 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

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

答案 1 :(得分:1)

他们大部分时间都是一样的。迂腐地说,标准说:

13.5.3作业[over.ass]

  

2)任何赋值运算符,甚至是复制和移动赋值运算符,都可以是虚拟的。

(correct reference in Steve's answer)

这使我们相信赋值运算符可以存在而无需复制或移动。

给出的例子是:

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

这让我相信第一个是简单的赋值运算符,而第二个是复制赋值运算符。这也保留了复制构造函数使用的命名法。

所以,我要说复制赋值运算符是一个赋值运算符,它将相同类型的引用(或对象)作为参数。

答案 2 :(得分:0)

赋值运算符为=,您可以像这样重载:

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

在这种情况下,我已经花了int,这是非常不寻常的,可能不可取。通常你会写一个复制赋值运算符,这意味着它需要引用T

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