运算符重载的一般规则

以下规则约束重载运算符的实现方式。但是,它们不适用于 删除 运算符,分别包含。

  • 您不能定义新运算符,例如 **。

  • 不能重定义运算符的含义,当应用于内置数据类型。

  • 重载运算符必须是一个非静态类成员函数或全局函数。需要私有访问的全局函数或受保护的类成员必须声明为该类的友元。全局函数都必须采用是类或枚举类型或者是对类或枚举类型至少有一个参数。例如:

    // rules_for_operator_overloading.cpp
    class Point
    {
    public:
        Point operator<( Point & );  // Declare a member operator 
                                     //  overload.
        // Declare addition operators.
        friend Point operator+( Point&, int );
        friend Point operator+( int, Point& );
    };
    
    int main()
    {
    }
    

    上面的代码示例声明小于运算符作为成员函数;但是,加法运算符声明为友元访问权限的全局函数。请注意多个实现可以在特定运算符提供。在前面的加号,提供两次实现实现 commutativity。一样该 Point 添加到 Point,对 Point的 int ,依此类推的运算符,可能实现。

  • 运算符遵循它们与内置类型的典型使用指定的操作数的优先级,分组和数量。因此,无法表示此概念 “加 2 和 3 到类型 Point对象,”期望要添加的 2 添加到到 3 x 坐标和 Y 坐标。

  • 作为成员函数声明的一元运算符不带参数;如果声明为全局函数,它们接受一个参数。

  • 作为成员函数声明的二元运算符采用一个参数;如果声明为全局函数,它们接受两个参数。

  • 如果运算符可用作一元或二元运算符 (, *、 **+**和 -),您可以单独重载每次使用。

  • 重载运算符不能具有默认参数。

  • 除分配 (operator=) 的所有重载运算符由派生类继承。

  • 成员函数重载运算符的第一个参数始终是运算符调用对象的类类型 (运算符声明的类或从该类派生的类)。转换没有为第一个参数中提供。

请注意可以完全更改的含义任何运算符。这包括地址 (),分配 (=) 的含义,并且函数调用运算符。此外,可以为内置类型取决于使用运算符重载,的标识进行更改。例如,以下四个语句通常是等效的,当完全计算:

var = var + 1;
var += 1;
var++;
++var;

此标识无法进行重载运算符的类类型确定。此外,某些要求隐式在使用这些运算符的基本类型的重载运算符是宽松。例如, " 添加/赋值运算符, +=,需要左侧操作数是左值,在对基本类型;,当重载时,不存在这样的要求运算符。

说明说明

对于一致性,那么,当定义重载运算符时,遵循内置类型的模型通常是最佳。如果重载运算符的语义与其含义码位在其他上下文,所以它比有用可以 scrum。

请参见

参考

运算符重载