пергрузка operator+ и operator+= |
Здравствуйте, гость ( Вход | Регистрация )
пергрузка operator+ и operator+= |
Litkevich Yuriy |
21.4.2010, 12:48
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Дошла очередь до освоения перегрузки этих операторов:
operator+= operator+ В книге Герберта Шилдта по С++, обе эти оператора объявляются и реализуются, как члены класса. А вот у тролей почему-то operator+ повсеместно используется как связанный не-член класса (т.е. описан просто в этом же заголовочнике), ну и соответственно он имеет два аргумента, а не один. Пример: Связанный не-член класса
член класса
Как же правильнее поступать? Делать operator+ членом класса или связанным не-членом obj1 + obj2 + obj3 + ... тут пардон, перепутал с operator= и конструкцией вида obj1 = obj2 = obj3 Я планировал сделать такой перегруженный оператор:
|
|
|
kibsoft |
21.4.2010, 13:52
Сообщение
#2
|
Участник Группа: Участник Сообщений: 180 Регистрация: 21.7.2009 Из: Самара Пользователь №: 928 Спасибо сказали: 14 раз(а) Репутация: 2 |
Вроде как не везде..
Цитата QList<T> QList::operator+ ( const QList<T> & other ) const То же самое в QSet, QVector. В QString наоборот.. непонятно почему.. |
|
|
Litkevich Yuriy |
21.4.2010, 14:20
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
kibsoft, да, я полез смотреть в Qt, и на несколько классов напоролся, где сделано как в QString, подумал, что всюду так
|
|
|
DIMEDROLL |
21.4.2010, 15:30
Сообщение
#4
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
Пример: Связанный не-член класса
член класса
Как же правильнее поступать? советую обзавестись и почитать книжку Липпман "С++ для начинающих", там в пункте 15.1.1. Члены и не члены класса есть ответ в двух словах: глобальный оператор+ дает возможность плюсовать так:
тоесть char* + QString А если его обьявить как локальный оператор класса, то левым операндом может быть только QString. Тоесть на приведенном коде будет ошибка компиляции. Цитата Итак, на основе чего принимается решение, делать ли оператор членом класса или членом пространства имен? В некоторых случаях у программиста просто нет выбора: • если перегруженный оператор является членом класса, то он вызывается лишь при условии, что левым операндом служит член этого класса. Если же левый операнд имеет другой тип, оператор обязан быть членом пространства имен; • язык требует, чтобы операторы присваивания ("="), взятия индекса ("[]"), вызова ("()") и доступа к членам по стрелке ("->") были определены как члены класса. В противном случае выдается сообщение об ошибке компиляции: З.Ы так же посоветую почитать книги: Мэйерс Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ Саттер Александреску Стандарты программирования на С++ Правила программирования на Си и Си++ Ален И. Голуб Саттер Решение сложных задач на С++ Макконнел Совершенный код, 2-е изд |
|
|
Iron Bug |
21.4.2010, 17:01
Сообщение
#5
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
в дополнение к сказанному выше: когда ты делаешь много операторов подобного типа с разными классами, то, если ты скомпилишь их внутри класса, то библиотека с твоим классом будет зависеть от библиотек всех классов, которые ты туда запихал. тот, кто будет потом использовать твой класс, может и не использовать все варианты, но ему придётся линковать все классы, которые ты засунул в свой класс, даже если он использует только один какой-то конкретный вариант. а в случае с внешней функцией при линковке неиспользуемые операторы просто не будут линковаться и всё. компилятору хватит включения заголовочников.
|
|
|
Litkevich Yuriy |
22.4.2010, 11:35
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А если его обьявить как локальный оператор класса, то левым операндом может быть только QString. да я уже Гербета Шилдта это нашёл. Что-то мне его книга всё меньше и меньше нравится.Первое место, где было про перегрузку оператора + написано об этом ни слова. Через несколько глав опять про этот оператор уже с двумя вариантами. Плохо, что так раскидано по книге а в случае с внешней функцией при линковке неиспользуемые операторы просто не будут линковаться и всё. а в таком случае, где они должны быть объявлены? Я пока вижу в разных примерах, что они объявлены в том же заголовочнике что и сам класс, только "под ним"
|
|
|
Iron Bug |
22.4.2010, 14:13
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
а в таком случае, где они должны быть объявлены? Я пока вижу в разных примерах, что они объявлены в том же заголовочнике что и сам класс, только "под ним" да, всё правильно. там они и должны объявляться. и включать все заголовочники на классы, которые в них используются. но на этапе линковки неиспользуемые функции отбросятся. а если засунуть методы внутрь класса, то тогда придётся ещё и линковать всё, что к классу относится, с твоей библиотекой. впрочем, это существенно только если предполагается многократное использование класса в разных программах. |
|
|
AD |
22.4.2010, 15:06
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
На мой взгляд, уже на таком профессиональном уровне, что ты, книгу Шилдта не стоит использовать (даже на уровне справочника). Лучше уже Страуструпом пользоваться. Так по его книге говорится, что операторы +, - и их варианты лучше делать не-членами класс, а вот += -= членами класса.
|
|
|
Текстовая версия | Сейчас: 25.11.2024, 9:37 |