演算子のオーバーロードに関する一般的な規則General Rules for Operator Overloading

次の規則は、オーバーロードした演算子の実装のされ方を抑制します。The following rules constrain how overloaded operators are implemented. ただし、 new演算子とdelete演算子には適用されませんが、個別に説明されています。However, they do not apply to the new and delete operators, which are covered separately.

  • . などの新しい演算子を定義することはできません。You cannot define new operators, such as ..

  • 組み込みのデータ型に適用された場合、演算子の意味は再定義できません。You cannot redefine the meaning of operators when applied to built-in data types.

  • オーバーロードされた演算子は、非静的クラス メンバー関数またはグローバル関数である必要があります。Overloaded operators must either be a nonstatic class member function or a global function. プライベートまたはプロテクト クラス メンバーへのアクセスを必要とするグローバル関数は、クラスのフレンドとして宣言する必要があります。A global function that needs access to private or protected class members must be declared as a friend of that class. グローバル関数は、クラスまたは列挙型の引数、またはクラスまたは列挙型への参照である引数を 1 個以上受け取る必要があります。A global function must take at least one argument that is of class or enumerated type or that is a reference to a class or enumerated type. 次に例を示します。For example:

    // 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()
    {
    }
    

    前のコード サンプルは、メンバー関数として小なり演算子を宣言します。ただし、加算演算子はフレンド アクセスを持つグローバル関数として宣言されます。The preceding code sample declares the less-than operator as a member function; however, the addition operators are declared as global functions that have friend access. 複数の実装を特定の演算子に対して提供できることに注意してください。Note that more than one implementation can be provided for a given operator. 前の加算演算子の場合は、可換を容易にするため、2 種類の実装が用意されています。In the case of the preceding addition operator, the two implementations are provided to facilitate commutativity. これは、をに、をに追加する演算子が Point Point int Point 実装される可能性があるのと同じです。It is just as likely that operators that add a Point to a Point, int to a Point, and so on, might be implemented.

  • 演算子は、組み込み型との一般的な使用方法によって指定されるオペランドの優先順位、グループ、および数に従います。Operators obey the precedence, grouping, and number of operands dictated by their typical use with built-in types. したがって、"型のオブジェクトに2と3を加算する" という概念を表す方法はありません Pointx座標に2を加算し、3をy座標に追加することを想定しています。Therefore, there is no way to express the concept "add 2 and 3 to an object of type Point," expecting 2 to be added to the x coordinate and 3 to be added to the y coordinate.

  • メンバー関数として宣言された単項演算子は引数を受け取りません。グローバル関数として宣言された場合は、引数を 1 つ受け取ります。Unary operators declared as member functions take no arguments; if declared as global functions, they take one argument.

  • メンバー関数として宣言された二項演算子は引数を 1 つ受け取ります。グローバル関数として宣言された場合は、引数を 2 つ受け取ります。Binary operators declared as member functions take one argument; if declared as global functions, they take two arguments.

  • 演算子を単項演算子または二項演算子 (、、、および) として使用できる場合は & * + - 、それぞれを個別にオーバーロードできます。If an operator can be used as either a unary or a binary operator (&, *, +, and -), you can overload each use separately.

  • オーバーロードされた演算子は、既定の引数を持つことができません。Overloaded operators cannot have default arguments.

  • 代入 (operator =) を除くすべてのオーバーロードされた演算子は、派生クラスによって継承されます。All overloaded operators except assignment (operator=) are inherited by derived classes.

  • メンバー関数のオーバーロードされた演算子の最初の引数は、常に演算子が呼び出されたオブジェクトのクラス型です (演算子が宣言されたクラス、またはそのクラスから派生したクラス)。The first argument for member-function overloaded operators is always of the class type of the object for which the operator is invoked (the class in which the operator is declared, or a class derived from that class). 最初の引数に対して変換の指定はありません。No conversions are supplied for the first argument.

どの演算子も意味を完全に変更できることに注意してください。Note that the meaning of any of the operators can be changed completely. これには、address of ( & )、assignment ( = )、および関数呼び出し演算子の意味が含まれます。That includes the meaning of the address-of (&), assignment (=), and function-call operators. また、組み込みの型に依存できる ID は、演算子のオーバーロードを使用して変更できます。Also, identities that can be relied upon for built-in types can be changed using operator overloading. たとえば、次の 4 つのステートメントは、通常、完全に評価される場合は等価です。For example, the following four statements are usually equivalent when completely evaluated:

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

演算子をオーバーロードするクラス型では、この ID に依存できません。This identity cannot be relied upon for class types that overload operators. また、基本型に対してこれらの演算子の使用が暗黙に必要とされていた条件は一部オーバーロードされる演算子に対して緩和されています。Moreover, some of the requirements implicit in the use of these operators for basic types are relaxed for overloaded operators. たとえば、加算/代入演算子では、 += 基本型に適用する場合、左オペランドは左辺値である必要があります。演算子がオーバーロードされている場合、このような要件はありません。For example, the addition/assignment operator, +=, requires the left operand to be an l-value when applied to basic types; there is no such requirement when the operator is overloaded.

注意

一貫性のために、オーバーロードされた演算子を定義する場合、組み込み型のモデルに従うことをお勧めします。For consistency, it is often best to follow the model of the built-in types when defining overloaded operators. オーバーロードされた演算子のセマンティクスが他のコンテキストではその意味とは大きく異なる場合、便利というよりも混乱を招く可能性があります。If the semantics of an overloaded operator differ significantly from its meaning in other contexts, it can be more confusing than useful.

関連項目See also

演算子のオーバーロードOperator Overloading