Каноническая перегрузка оператора?

Используйте этот код

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

7
задан Eclipse 7 January 2009 в 23:21
поделиться

4 ответа

В книге Bjarne Stroustrup "Язык Программирования на C++", в главе 11 (та, посвященная Перегрузке Оператора), он проходит обвинение класса для типа комплексного числа (разделите 11.3).

Одна вещь, которую я действительно замечаю от того раздела, состоит в том, что он реализует смешанные операции типа... это, вероятно, ожидается для любого числового класса.

В целом, что у Вас есть хорошие взгляды.

4
ответ дан 6 December 2019 в 15:36
поделиться

Большая вещь рассмотреть при записи любого оператора состоит в том, что членские операторы не подвергаются преобразованиям на левом параметре:

struct example {
  example(int);
  example operator + (example);
};

void foo() {
  example e(3), f(6);
  e + 4; // okay: right operand is implicitly converted to example
  e + f; // okay: no conversions needed.
  6 + e; // BAD: no matching call.
}

Это вызвано тем, что преобразование никогда не относится this для функций членства, и это расширяется на операторы. Если оператор был вместо этого example operator + (example, example) в глобальном пространстве имен это скомпилировало бы (или если pass-by-const-ref использовался).

В результате симметричные операторы как + и - обычно реализуются как нечлены, тогда как составные операторы присваивания как += и -= реализованы как участники (они также изменяют данные, означая, что они должны быть участниками). И, так как Вы хотите избежать дублирования кода, симметричные операторы могут быть реализованы с точки зрения составных присвоения (как в Вашем примере кода, хотя конвенция рекомендует делать временную внутреннюю часть функцией).

4
ответ дан 6 December 2019 в 15:36
поделиться

Конвенция состоит в том, чтобы записать operator+(const T&) и operator-(const T&) с точки зрения operator+=(const T&) и operator-=(const T&). Если имеет смысл добавлять, и вычитать к/от типам примитивов затем необходимо записать конструктору, который создает объект из типа примитива. Затем перегруженные операторы будут также работать на типы примитивов, потому что компилятор вызовет соответствующего конструктора неявно.

Как Вы упомянули себя, необходимо постараться не давать права доступа функциям, для которых не нужен он. Но в Вашем коде выше для operator+(Number, const Number&) Я лично сделал бы обе ссылки константы параметров и использовал бы временный файл. Я думаю, что не удивляет, что комментатор ниже Вашего вопроса пропустил это; если Вы не имеете серьезное основание не к, избегаете неожиданностей и приемов и максимально очевидны.

Если Вы хотите, чтобы Ваш код интегрировался с другими числовыми типами, сказал std::complex, не упустите циклические преобразования. Таким образом, не предоставляйте operator OtherNumeric() в Numeric если OtherNumeric предоставляет конструктора, который берет a Numeric параметр.

3
ответ дан 6 December 2019 в 15:36
поделиться

Традиционно записать оператор X с точки зрения оператора =X
Также традиционно, что все параметры к стандартным операторам являются константой

// Member operator
// This was OK
Number& Number::operator+= (Number const& rhs) 
{
    Impl->Value += rhs.Impl->Value; // Obviously this is more complicated
    return *this;
}

// Non-member non-friend addition operator
Number operator+(Number const& lhs,Number const& rhs)
{
     // This I would set the lhs side to const.
     // Make a copy into result.
     // Then use += add the rhs
     Number result(lhs);
     return result += rhs;
}

Вы упоминаете оператор присваивания.
Но Вы не упоминали конструктора копии. Так как Ваш класс имеет владение НЕОБРАБОТАННОГО указателя, я ожидал бы, что Вы определите это также. Оператор присваивания затем традиционно записан с точки зрения конструктора копии.

3
ответ дан 6 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: