C++ 重载赋值运算符与提供隐式构造函数
我刚刚在《C++初级读本》(第五版)第563页了解到,赋值运算符可能会过载。因此,如果我正在编写一个类C++ 重载赋值运算符与提供隐式构造函数,c++,constructor,operator-overloading,assignment-operator,C++,Constructor,Operator Overloading,Assignment Operator,我刚刚在《C++初级读本》(第五版)第563页了解到,赋值运算符可能会过载。因此,如果我正在编写一个类C,并且将一个整数赋给这个类的对象是有意义的,那么我可以为赋值操作符提供一个rhs类型int。然后我的类的客户可以写: C c; ... c = 5; 问题:如果这样的赋值有意义,那么隐式构造函数C(int)是真的吗也应该有意义吗?如果是这样,那么我应该真正定义这个构造函数(它还有其他用途),并且永远不需要重载赋值运算符。我遗漏了什么吗?您也不需要赋值运算符,只需要int C(5);以int作
C
,并且将一个整数赋给这个类的对象是有意义的,那么我可以为赋值操作符提供一个rhs
类型int
。然后我的类的客户可以写:
C c;
...
c = 5;
问题:如果这样的赋值有意义,那么隐式构造函数
C(int)是真的吗代码>也应该有意义吗?如果是这样,那么我应该真正定义这个构造函数(它还有其他用途),并且永远不需要重载赋值运算符。我遗漏了什么吗?您也不需要赋值运算符,只需要int
C(5);以int
作为参数调用构造函数
C=5;以int
作为参数调用构造函数
C C;c=5;调用默认构造函数,第二条语句将调用构造函数到int
,然后调用赋值运算符
(2) 可能会引起混乱。必须使用构造函数,因为对象不存在。您也不需要赋值运算符,只需要来自int
C(5);以int
作为参数调用构造函数
C=5;以int
作为参数调用构造函数
C C;c=5;调用默认构造函数,第二条语句将调用构造函数到int
,然后调用赋值运算符
(2) 可能会引起混乱。由于对象不存在,必须使用构造函数。如果C
定义了一个非显式的构造函数,该构造函数接受int
,那么您不一定需要赋值操作符接受int
,但它可能会更有效
如果运算符=(int)
存在:
C c; //default constructor
c = 5; //assignment from int
如果C(int)
存在且运算符=(int)
不存在:
C c; //default constructor
c = 5; //construction of temporary from int, then assignment from C
如果移动语义对C
有效,则后者可能是可以接受的。如果不是,您可能还是要定义操作符=(int)
。归根结底,这取决于许多因素,如分配给C
的频率、副本的价格等。了解这些问题,找出它们如何应用于您的班级,然后选择最合理的解决方案。如果C
定义了一个采用int
的非显式
构造函数,那么您不一定需要赋值运算符来采用int
,但它可能会更有效
如果运算符=(int)
存在:
C c; //default constructor
c = 5; //assignment from int
如果C(int)
存在且运算符=(int)
不存在:
C c; //default constructor
c = 5; //construction of temporary from int, then assignment from C
如果移动语义对C
有效,则后者可能是可以接受的。如果不是,您可能还是要定义操作符=(int)
。最终,这取决于许多因素,如分配给C
的频率、副本的价格等。了解这些问题,找出它们如何适用于您的类,然后选择最合理的解决方案
如果这样的赋值有意义,那么隐式赋值是真的吗
建造商C(int);也应该有意义吗
依情况而定。赋值和隐式构造函数之间的区别在于,在赋值中已经有一个设置对象,而在隐式转换中,您必须创建一个只给定int的对象
在最常见的场景中,赋值操作符只会忘记原始对象的所有数据。在这种情况下,您还应该能够将int转换为C
。但是,我可以想象赋值操作符实际使用原始对象中的一些数据的情况。在这种情况下,不能考虑任何转换构造函数
一个简单的例子:考虑数值模拟项目,它具有类<代码> Mesh 一组空间点,在其中进行计算,而类<代码>字段这是点上的一组值(例如,点上的温度)。如果没有网格,
字段
就不能存在:
class Field {
const Mesh& mesh;
std::vector<int> data;
};
类字段{
const-Mesh&Mesh;
std::矢量数据;
};
这里不能创建字段(int)
构造函数,因为您没有网格。但是,您可能会想到Field::operator=(int)
赋值,它将用给定的int
替换所有数据
值,从而保持网格
完好无损
因此,您的第一个问题的答案是:否,即使作业有意义,转换也不总是有意义
然而,如果这不是你的情况,转换和赋值都有意义,那么请参考@TartanLlama的答案
如果这样的赋值有意义,那么隐式赋值是真的吗
建造商C(int);也应该有意义吗
依情况而定。赋值和隐式构造函数之间的区别在于,在赋值中已经有一个设置对象,而在隐式转换中,您必须创建一个只给定int的对象
在最常见的场景中,赋值操作符只会忘记原始对象的所有数据。在这种情况下,您还应该能够将int转换为C
。但是,我可以想象赋值操作符实际使用原始对象中的一些数据的情况。在这种情况下,不能考虑任何转换构造函数
一个简单的例子:考虑数值模拟项目,它具有类<代码> Mesh 一组空间点,在其中进行计算,而类<代码>字段这是点上的一组值(例如,点上的温度)。如果没有,则字段
不能存在