Class c+中的设计选择+;

Class c+中的设计选择+;,class,c++11,pointers,reference,Class,C++11,Pointers,Reference,类X中的重载赋值运算符通常使用返回类型X&来声明。但是,这并不是C++中的一个绝对要求;程序可以使用不同的返回类型进行编译 假设您编写了一个类X,其中声明了以下每个赋值运算符。对于每一个问题,简要解释为什么做出指定的设计选择而不是通常的设计选择会有问题 void operator=(const X& x) X operator=(const X& x) 分别回答这些问题;在每种情况下,只声明一个赋值运算符,而不是两个赋值运算符 注意,回答这个问题并不是一个诚实的尝试,因为“C+

类X中的重载赋值运算符通常使用返回类型X&来声明。但是,这并不是C++中的一个绝对要求;程序可以使用不同的返回类型进行编译

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

void operator=(const X& x)
X operator=(const X& x)
分别回答这些问题;在每种情况下,只声明一个赋值运算符,而不是两个赋值运算符


注意,回答这个问题并不是一个诚实的尝试,因为“C++程序员通常会声明赋值操作符为x和操作符=(const x和x)”这个问题并不是问通常的设计选择是什么;这个问题是关于为什么。

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

if (my_x = get_value()) {
    // do something when my_x evaluates to non-zero/non-null
}
类型为
x
my_x
和无效返回赋值运算符将无法执行

如果使用第二种变体,则有触发
X
副本的风险。现在,这并不可怕,因为这些天我们保证;而且拷贝通常会被进一步删除,但这仍然是一种可能性。对于非常重的X(例如,长向量),您可能希望确保不会发生这种情况。按值返回也会阻止组合到某些复杂表达式中,例如

sort_in_place(x = get_values());

这看起来像是您收到的作业的复制粘贴。