class - c++ 中的设计选择
问题描述
使用返回类型 X& 声明类 X 中的重载赋值运算符是很常见的。然而,事实证明这并不是 C++ 中的绝对要求。程序可以在返回类型不同的情况下进行编译。
假设您编写了一个类 X 并声明了以下每个赋值运算符。对于他们每个人,简要解释为什么做出指定的设计选择,而不是通常的选择,会有问题。
void operator=(const X& x)
X operator=(const X& x)
分别回答这些;在每种情况下,只声明一个赋值运算符,而不是两个。
请注意,回答这个问题时说“因为 C++ 程序员通常将赋值运算符声明为 X& operator=(const X& x)”之类的回答并不是诚实的尝试。这个问题不是问通常的设计选择是什么。这个问题是关于为什么。
解决方案
如果您使用第一个变体(返回 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());