![]() |
|
Модераторы: bsa |
![]()
|
|
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
Подскажите пожалуйста. Вот код:
почему перегруженный оператор, который изменяет состояние объекта, имеет бОльший приоритет, чем тот, который не меняет? (тоесть всегда вызывается тот, который изменяет состояние объекта). -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
Оказалось что компилятору всеравно что именно делает оператор, он просто вызывает const операторы только для const обьектов, чтоб принудительно его вызвать следует писать как-то так:
"c" изменится только один раз. |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
asmdzen, переделал маин:
теперь все понял. Спасибо за объяснение. Вопрос решен. Добавлено @ 22:49 asmdzen, ну в смысле по вашему пример следовал Это сообщение отредактировал(а) Чoо - 9.12.2010, 22:51 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Чoо |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
рано пометил тему решенной
вот простой код:
хочу в функцию-оператор << передавать ссылку на объект, а не передавать объект по значению. если объявить:
то можно вызвать только:
ну оно понятно почему работает а
нелльзя. Тоже понятно почему: возвращается объект, который копируется в исходный и уничтожается. так вот, как мне все-таки и там и там передавать указатели на объекты? Добавлено @ 13:49 возвращать ссылку в постфиксе(так):
не хочется, так как хочу скопировать поведение:
Это сообщение отредактировал(а) Чoо - 10.12.2010, 13:49 -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||||||||||
|
|||||||||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Всегда используй константные ссылки, если нет задачи менять объект внутри функции:
Кстати, использование using namespace внутри хидеров причина очень больших неприятностей. Имей это в виду. Добавлено через 2 минуты и 31 секунду Делать подобные вещи - дурной тон. За редким исключением, изменение СТАНДАРТНОГО ПОВЕДЕНИЯ операторов и функций следует избегать, дабы не усложнять дальнейшее использование данного класса. |
|||
|
||||
| Чoо |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
bsa, спасибо за помощь. всё пошло, хотя мне не понятно, почему ссылка, которая указывает на константный объект нормально воспринимается, а если просто ссылка - то это приводит к ошибке.
оК, учту это. в принципе это понятно.
что такое хидеры?
тоже понял -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||||
|
|||||||
| Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
файлы заголовка(header files) *.h.
http://forum.vingrad.ru/index.php?showtopi...t&p=1964426 Это сообщение отредактировал(а) Crafty - 10.12.2010, 21:26 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
Crafty,
понял. подумал, сначала, что образовано от hide прочитал, спасибо. тогда получается, что надо было писать так, вместо неймспейса?
-------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
Желательно выработать у себя такую привычку не использовать using namespace, единственное исключение ИМХО в простых тестовых программках где один файл main.cpp.
Если в хидерах часто используется какое-то имя, то можно написать using std::cin, а если имя используется всего пару раз, то лучше обойтись вообще без using и писать явно из какого пространства это имя (например std::cout << "Hello world" << std::endl). Это сообщение отредактировал(а) Crafty - 10.12.2010, 22:58 |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
Crafty, по этой теме я вообще ни чего не знал, видать проблем не было
Вопрос пока помечу решенным, пока вопросов нет -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| Crafty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 319 Регистрация: 3.11.2008 Репутация: 12 Всего: 14 |
||||
|
||||
| Чoо |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
снова вопрос. и снова по перегрузке унарных операторов.
Снвоа простой код:
буду рассматривать строку
Какова последовательность действий?: 1. вызов перегруженной функции оператора, которая выводит содержимое поля объекта в стандартный поток 2. передача указателя обратно в функцию main. 3. операция косвенного выбора -> (на этот раз неперегруженная) m 4. присвоение значения для поля m. Я правильно понял? Посмотрел отладчиком, вроде так и получается. -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Чoо, для умного указателя, у тебя не хватает деструктора.
В хидерах вообще никаких using (касательно каких-либо namespace) использовать не стоит, за исключением тела функций и собственных пространств имен. Потому что пользователь хидера может не ожидать, что ты ему в глобальное пространство вывалил что-то из другого. |
|||
|
||||
| Чoо |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 22.9.2009 Репутация: 4 Всего: 4 |
да, точно, забыл. Добавил в класс:
а последовательность я правильно понял? -------------------- ![]() OS: Debian Squeeze (kernel 3.8.2) IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |