Obecná pravidla přetížení operátoru
Následující pravidla omezují způsob, jakým jsou implementovány přetížené operátory.Nelze je použít na operátory new a delete, které jsou pokryty samostatně.
Nelze definovat nové operátory, jako například **.
Nelze předefinovat význam operátorů při použití předdefinovaných datových typů.
Přetížené operátory musí být členské funkce nestatické třídy nebo globální funkce.Globální funkce, která požaduje přístup k soukromým nebo chráněným členům musí být pro třídu deklarována jako přátelská.Globální funkce musí přebírat alespoň jeden argument třídy nebo výčtového typu nebo odkazu na třídu nebo výčtový typ.Příklad:
// 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() { }
Předchozí příklad kódu deklaruje operátor "menší než" jako členskou funkci. Operátory sčítání jsou však deklarovány jako globální funkce, které mají "přátelský" přístup.Všimněte si, že pro daný operátor může být poskytnuta více než jedna implementace.V případě předchozího operátoru sčítání jsou poskytnuty dvě implementace pro poskytnutí komutativity.Je to stejně pravděpodobné, jako implementace operátorů, které sčítají Point s Point, int s Point, atd..
Operátory dodržují seskupování a respektují počet operandů zadaný jejich typickým použitím v rámci předdefinovaných typů.Proto neexistuje žádný způsob, jak vyjádřit pojem "přičíst 2 a 3 k objektu typu Point," s očekáváním, že bude číslo 2 přidáno k souřadnici x a číslo 3 bude přidáno k souřadnici y.
Unární operátory, které jsou deklarovány jako členské funkce nepřebírají žádné argumenty. Jsou-li deklarovány jako globální funkce, přebírají jeden argument.
Binární operátory, které jsou deklarovány jako členské funkce přebírají jeden argument. Jsou-li deklarovány jako globální funkce, přebírají dva argumenty.
Je-li možné použít operátor jako unární nebo jako binární operátor (&, *, + a -), lze provést přetížení každého z nich samostatně.
Přetížené operátory nemohou mít výchozí argumenty.
Všechny přetížené operátory s výjimkou přiřazení (operator=) jsou zděděny z odvozených tříd.
První argument přetížených operátorů členské funkce je vždy typu třídy objektu, pro který je operátor vyvolán (třída, ve které je operátor deklarován nebo třída odvozená z této třídy).Pro první argument nejsou k dispozici žádné převody.
Všimněte si, že význam libovolného operátoru lze zcela změnit.To zahrnuje význam adresy (&), přiřazení (=) a operátorů volání funkce.Identity, které lze dovolávat pro vestavěné typy lze také změnit pomocí přetěžování operátoru.Následující čtyři příkazy jsou obvykle při vyhodnocování zcela ekvivalentní:
var = var + 1;
var += 1;
var++;
++var;
Tuto identitu nelze dovolávat pro typy tříd, které přetěžují operátory.Kromě toho některé požadavky zahrnují použití těchto operátorů pro základní typy, které jsou zmírněny pro přetížené operátory.Například operátor přiřazení/sčítání/ += vyžaduje, aby byl levý operand hodnota l, při použití na základní typy. V případě, že je operátor přetížen, neexistuje žádný takový požadavek.
[!POZNÁMKA]
V rámci konzistence je při definování přetížených operátorů často nejlepší postupovat podle modelu předdefinovaných typů.Liší-li se významně sémantika přetíženého operátoru od jeho významu v jiných kontextech, může být více matoucí než užitečný.