首页 > 解决方案 > c++ 中的设计选择

问题描述

使用返回类型 X& 声明类 X 中的重载赋值运算符是很常见的。然而,事实证明这并不是 C++ 中的绝对要求。程序可以在返回类型不同的情况下进行编译。

假设您编写了一个类 X 并声明了以下每个赋值运算符。对于他们每个人,简要解释为什么做出指定的设计选择,而不是通常的选择,会有问题。

void operator=(const X& x)
X operator=(const X& x)

分别回答这些;在每种情况下,只声明一个赋值运算符,而不是两个。

请注意,回答这个问题时说“因为 C++ 程序员通常将赋值运算符声明为 X& operator=(const X& x)”之类的回答并不是诚实的尝试。这个问题不是问通常的设计选择是什么。这个问题是关于为什么。

标签: classc++11pointersreference

解决方案


如果您使用第一个变体(返回 void),则无法将赋值组合成更复杂的表达式。也就是以下常见的成语:

if (my_x = get_value()) {
    // do something when my_x evaluates to non-zero/non-null
}

将不可能用于my_x类型X和返回 void 的赋值运算符。

如果您使用第二种变体,则可能会触发X. 现在,这并没有那么可怕,因为这些天我们已经保证了返回值优化;并且副本通常会被进一步忽略,但这仍然是一种可能性。对于非常重的 X(例如长向量),您可能希望确保不会发生这种情况。按值返回也排除了组合成某些复杂的表达式,例如

sort_in_place(x = get_values());

推荐阅读