0%

[Effective C++ 笔记]条款 10. 令赋值操作返回一个自身的引用

简介

本条款建议令赋值操作符返回一个 *this 的引用。

引子

在 C++ 的赋值操作中,我们可以写成如下连锁形式(完整代码见 Ex1):

1
2
3
4
5
int x, y, z;
x = y = z = 15;
std::cout << "x = " << x << std::endl;
std::cout << "y = " << y << std::endl;
std::cout << "z = " << z << std::endl;

输出:

1
2
3
x = 15
y = 15
z = 15

由于赋值操作遵守右结合律,所以连锁赋值形式也可以理解成如下形式:

1
x = (y = (z = 15));

由上面的形式,我们可以得知,这里连锁赋值的原理在于:首先将 15 赋值给 z,然后这个操作会返回 z(更新后的),并将更新后的 z 赋值给 y,同样道理最后赋值给 x

对赋值相关预算进行实现

上述的操作是针对基本类型的,对于非基本类型为了实现这样的操作我们需要在实现赋值操作符时让该操作返回一个引用,该引用指向操作符的左侧实参,如下所示(完整测试代码见 Ex2):

1
2
3
4
5
6
7
8
9
10
11
class Widge {
public:
// ...

Widge& operator=(const Widge& rhs) {
// ...
return *this;
}

// ...
};

类似地,这个协议不仅适用于标准赋值形式,也适用于所有赋值相关运算,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Widge {
public:
// ...

Widge& operator+=(const Widge& rhs) {
// ...
return *this;
}

Widge& operator=(const Widge& rhs) {
// ...
return *this;
}

// ...
};

当然,这不是强制性的,即使不遵守它编译和运行也不会出错。但目前所有内置类型和标准库中的提供的类型(stringvector 等等)都遵守这一协议,所以如果没有特殊情况还是尽量遵守此协议

结论

令赋值操作符返回一个 *this 的引用。

完整可运行代码地址:Effective-Cpp-Reading-Note
Efftive C++ 阅读笔记:Effective C++