C++ 重载赋值运算符与提供隐式构造函数

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++初级读本》(第五版)第563页了解到,赋值运算符可能会过载。因此,如果我正在编写一个类
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 一组空间点,在其中进行计算,而类<代码>字段这是点上的一组值(例如,点上的温度)。如果没有,则

    字段
    不能存在