Общие правила перегрузки операторов
Ниже перечислены правила, ограничивающие как перегруженные операторы реализованы.Однако они не применяются к создать и удалить операторы, которые покрыты отдельно.
Нельзя задать новые операторы, такие как **.
Нельзя переопределить значение операторов применяется к встроенным типам данных.
Перегруженные операторы должны быть либо нестатического функцией члена класса или глобальной функции.Глобальную функцию, что требуется доступ к закрытому или защищенные члены класса должен быть объявлен как отличаться от этого класса.Глобальная функция должна иметь по крайней мере один аргумент, класса или перечислимого типа или ссылка на класс или перечисляемый тип.Примеры.
// 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 2.Это аналогично, скорее всего, операторы, которые добавляют a Point к a Point" int к a Pointи т д, может быть реализовано.
Операторы подчиняются приоритету, группированию и число операндов продиктованному их типичной использованием со встроенными типами.Следовательно, нельзя выразить понятие "добавляют 2 и 3 в объект типа Point" ожидающ, что 2 были добавлены к x координата и 3, добавляемый к y координата.
Унарные операторы, объявленные как функции-члены не принимают аргументы; если объявлена как глобальные функции, они принимают один аргумент.
Двоичные операторы, объявленные как функции-члены принимает один аргумент. если объявлена как глобальные функции, они занимают 2 аргументов.
Оператор if может использоваться в качестве или унарный оператор или (binary&" *" +и -), можно перегружать каждая использовать отдельно.
Перегруженные операторы не могут иметь аргументы по умолчанию.
Все перегруженные операторы присваивания (кроме**operator=**inherit) производными классами.
Первый аргумент для операторов перегруженных функцией-членом всегда типа класса объекта, для которого оператор вызова (класса, в котором объявлен оператор или класс, производный от этого класса).Никакие преобразования не предоставлены для первого аргумента.
Обратите внимание, что значение любого оператора можно изменить.Это включает взятия адреса (смысл&назначение ()=) и операторы вызова функции.Кроме того, идентификаторы, которые могут положиться на для встроенных типов можно изменить, используя перегрузку операторов.Например, следующие 4 выписки обычно эквивалентны, когда полностью вычисляется:
var = var + 1;
var += 1;
var++;
++var;
Этот идентификатор нельзя полагаться на для типов классов, перегружают операторы.Кроме того, некоторые компоненты неявных в использовании этих операторов для основных типов смягчается для перегруженных операторов.Например, добавление/, оператор присваивания +=требуется, что левый операнд будет l-значением применяется к базовым типам; такое требование, когда оператор перегружен.
Примечание |
---|
Для обеспечения согласованности, зачастую лучше всего следовать моделью встроенных типов, определяющий перегруженные операторы.Если семантика перегруженного оператора значительно отличается от его значения в других контекстах, это может быть полезно смущатьее меньше. |