Среди всех вещей, которые я изучил на C++ (что не так много), перегрузка оператора кажется самой сложной. В общих чертах, когда лучше написать операторную перегрузку как функцию друга? Когда мне нужно объяснять использование *this
? Всегда ли вредно использовать временный объект?Каков наилучший способ реализации перегрузки оператора?
ответ
Ответ Нила правильный. Кроме того, this link предоставляет много хороших сведений о том, когда, где, почему и как использовать различные типы перегрузки операторов на C++.
В общем, я бы попытался придерживаться перегрузок, которые являются интуитивно понятными - использование оператора «+» должно отражать что-то аналогичное добавлению и т. Д. Если вы обнаружите, что выполняете строковые сравнения с оператором «+» или что-то вроде этого, вы, вероятно, должны использовать стандартные функции.
Перегрузка оператора магическим абуртом - такие перегрузки - это просто функции со странно выглядящими именами. Таким образом, вы пишете перегрузки операторов так же, как и вы именовали функцию. На самом деле, часто бывает полезно сначала написать именованную функцию - вы всегда можете изменить ее на оператора позже.
Единственное, что вы должны быть осведомлены о том, что компилятор использует пару ваших операторов:
- оператор =() при хранении вещей в коллекциях
- оператор <() при сортировке/поиске вещей
Первое правило перегрузки операторов: не перегружайте операторы, которые не имеют смысла. Например, оператор + может выглядеть как хороший выбор для добавления элементов в списки, но это не так: не каждый найдет это логичным.
Относительно математических операторов friend
не используется.
Типичный способ определить их (что уважает симметрию и неявные преобразования) заключается в следующем:
struct T {
T& operator+=(T const& rhs) {
// the actual addition code
return *this;
}
};
T const operator+(T const& lhs, T const& rhs) {
return T(lhs) += rhs;
};
Однако эта организация не приспособлена к операторам, как Matrix
или Polynomial
умножения, как оператор *=(T const&)
является не то, что тривиально. В этом случае мы определяем operator*=(T const&)
на вершине operator*(T const&, T const&)
и бинарный operator*()
может быть friend
, если нет сбруи на внутренние данные - это использование friend
не является нарушение инкапсуляции, но инкапсуляция исполнение -, или для целей оптимизации.
Если вы действительно хотите устранить большинство времен, посмотрите на шаблоны выражений (см. Blitz ++, boost.ublas, newmat, ...) или дождитесь ссылок на C++ 0x rvalue.
Не возвращайте константу. – 2010-03-25 07:06:00
Все операторы перегружают как функцию-член, принимают * это как lvalue, поэтому вам нужен друг в случаях, когда вы не хотите, чтобы такие операторы перегрузочного потока были < < и >>. В большинстве других случаев использование друзей нарушить принцип наименьших привилегий. Другим способом перегрузки оператора, который не был указан, является использование глобальной функции.
- 1. Каков наилучший способ реализации поиска?
- 2. Каков наилучший способ реализации протоколов?
- 3. Каков наилучший способ реализации заводского метода
- 4. Каков наилучший способ реализации нескольких фильтров AngularJS?
- 5. Каков наилучший способ реализации этого SQL-запроса?
- 6. Каков наилучший способ реализации облачного хранилища Google?
- 7. Каков наилучший способ реализации этой структуры?
- 8. Каков наилучший способ реализации контроллера в PHP?
- 9. Каков наилучший способ реализации безопасности через http:
- 10. Каков наилучший способ реализации взаимодействия между qwebview?
- 11. Каков наилучший способ реализации конструкции `` `Python?
- 12. Каков наилучший способ синхронизации реализации этого события
- 13. Каков наилучший способ реализации «Забыли пароль?» страница?
- 14. Каков наилучший способ реализации нескольких видов деятельности?
- 15. Каков наилучший способ реализации версий двоичного кода?
- 16. Каков наилучший способ реализации TCP-клиента python?
- 17. Каков наилучший способ реализации «слайдеров» AJAX?
- 18. Каков наилучший способ реализации предварительно вычисленных данных?
- 19. Каков наилучший способ реализации семафора в Go
- 20. Каков наилучший способ реализации единого входа?
- 21. Каков наилучший способ реализации одномерного обнаружения столкновения?
- 22. Каков наилучший/самый чистый способ реализации прокрутки?
- 23. Каков наилучший способ реализации потокобезопасного словаря?
- 24. Каков наилучший способ реализации массивов переменной длины?
- 25. Каков наилучший способ для реализации одного изображения?
- 26. Каков наилучший способ реализации страницы потоковых котировок?
- 27. Каков наилучший способ реализации шаблона проектирования узора.
- 28. Каков наилучший способ реализации 2D-сетки переключателей?
- 29. Каков наилучший способ реализации метода переупорядочения?
- 30. Каков наилучший способ реализации опроса в Joomla?
многие библиотеки также используют оператор() для обработки объектных объектов –
Действительно, и оператор == используется другими, и ... но я не хотел подавлять новичка. – 2009-04-22 12:45:10