1

目前我正在阅读C++ 11 标准,其中(第 12 章)提到了一些特殊的成员函数?复制?赋值运算符

我已经遇到过 operator=,它只是赋值运算符

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

Class_name instance_name1 = instance_name2;   

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

那么,使用什么复制赋值运算符,如何声明它以及你能给我一些它的用法示例。提前致谢!

4

3 回答 3

7

它在标准 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定义之后是一个包含赋值表达式的表达式语句。赋值表达式使用赋值运算符,定义使用构造函数。

如果重载决议的通常规则选择一个赋值运算符是一个复制赋值运算符,那么这就是使用复制赋值运算符的时候:

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

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

于 2012-11-07T10:30:12.690 回答
1

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

13.5.3 赋值[over.ass]

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

(史蒂夫回答中的正确参考)

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

给出的例子是:

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

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

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

于 2012-11-07T10:27:11.290 回答
0

赋值运算符是=,你可以像这样重载它:

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

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

struct T
{
   T& operator=(const T&);
};
于 2012-11-07T10:40:05.797 回答