|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|||||||||||
Константные функции-члены класса, возвращающие ссылку на константу08.08.2011, 21:09. Показов 13329. Ответов 64
Метки нет (Все метки)
Упражняюсь по книге Липпмана, выполняю задания по теме классы.
Необходимо реализовать класс person, который способен хранить имя и адрес человека, а также создать функции, возвращающие при обращении имя и адрес. Вопрос, который ставит автор книги: "Должны ли эти функции быть константными? Объясните почему." Вот тут я начал путаться. Вот моя реализация: файл person.h
1) Константными эти функции должны быть, так как они не меняют значений переменных-членов объекта. 2) Возвращать они должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования. Прав ли я? Если нет, то объясните почему.
0
|
|||||||||||
| 08.08.2011, 21:09 | |
|
Ответы с готовыми решениями:
64
Константные функции-члены ? класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) |
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
||||||||||||||||||||||||||
| 09.08.2011, 18:51 [ТС] | ||||||||||||||||||||||||||
|
2 Deviaphan - Спасибо за демонстрацию, повторное использование действительно невозможно и сделать &sss ссылкой на не константную переменную тоже невозможно.
Если изменить методы класса person так:
0
|
||||||||||||||||||||||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||||||
| 09.08.2011, 18:59 | |||||||
|
Но я предпочитаю возвращать константную ссылку для сложных объектов (в том числе и строк), но не использую потенциально опасные конструкции (как в примере). Объекты, локальные для строки кода нужно использовать очень аккуратно и лучше вообще их не использовать, пока не поймёшь до конца принцип их работы и время жизни этих объектов. Т.е. лучше возвращать константную ссылку, но использовать код вида:
1
|
|||||||
|
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
| 09.08.2011, 19:26 | |
|
0
|
|
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|||||||
| 09.08.2011, 22:01 [ТС] | |||||||
|
Однозначного ответа, как я понимаю тут нет. Из всего сказанного я сделал такие выводы: - можно возвращать константную ссылку на объект, надеясь на то, что пользователь моего класса не будет писать подобные инструкции:
0
|
|||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
|
| 09.08.2011, 23:11 | |
|
Roof, однозначно PointsEqual правильно говорит. Ссылка действительно может пережить свой объект. Так, что, возвращайте строку, а не ссылку.
2
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 09.08.2011, 23:29 | |
|
кроме того к вопросу о копировании - в продвинутых библиотеках (в Qt точно знаю, полагаю, что так сделано и в многих реализациях stl) контейнеры реализуют идиому "письмо - конверт" (манипулятор/тело), обеспечивающую эффективные операции копирования - фактически применение принципа копирования при записи
это я к тому, что зная, что операции копирования контейнеров растратные, нужно учитывать, что они могут быть много хитрее и на самом деле не приводить к выделению памяти и копированию данных и не пренебрегать безопасностью
2
|
|
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|
| 09.08.2011, 23:59 [ТС] | |
|
easybudda, alex_x_x - спасибо за ответы, очень помогли.
0
|
|
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
||||||
| 10.08.2011, 00:30 | ||||||
|
На самом деле всё хитрее...
2
|
||||||
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|||||||||||||||||
| 10.08.2011, 06:27 [ТС] | |||||||||||||||||
|
2 easybudda,
Однозначно - буду возвращать строку, а не ссылку. Но мне не понятен смысл Вашего примера. Вот как я его понял: Методы get_name() и get_address() возвращают ссылку на константу, как в Вашем примере.
Также два раза выведется Vasya, если методы get_name() и get_address() будут возвращать константные строки или просто строки. Соответственно объявление и инициализацию переменной n я проводил так:
Т.е. осталось понять, что именно Вы хотели сказать в Вашем примере.
0
|
|||||||||||||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
|||||||
| 10.08.2011, 09:54 | |||||||
1
|
|||||||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 10.08.2011, 10:30 | ||
|
1
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 10.08.2011, 10:40 | ||
Но чтобы возвращать умные указатели на внутренние данные объекта, эти данные должны быть умными указателями. Что не всегда желательно и возможно. С другой стороны, С++ вообще очень потенциально опасный язык и речь должна идти о культуре программирования и опыте программиста. Когда пишешь простой и понятный код, опасные конструкции встречаются гораздо реже.
0
|
||
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|
| 10.08.2011, 15:22 [ТС] | |
|
Спасибо всем ответившим. На свой вопрос получил однозначный ответ.
0
|
|
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
|
| 10.08.2011, 15:42 | |
|
Roof, ну и в заключении поясню суть своего примера: я его дома на ноуте с debian делал, там, напомню, два раза Vasya вывелось. А вот, как этот же самый код (отсюда скопировал) с другими компиляторами работает:
Можно долго гадать, или разбираться, почему оно так, но лучше просто не оставлять такие вещи на откуп компилятору...
2
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 10.08.2011, 15:50 | |
|
0
|
|
|
53 / 53 / 8
Регистрация: 21.03.2009
Сообщений: 371
|
||||||
| 10.08.2011, 16:03 | ||||||
|
Возврат const string & необходим чтобы избежать возможности изменять private часть класса без использования интерфейса
0
|
||||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
||
| 10.08.2011, 16:04 | ||
|
1
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 10.08.2011, 16:08 | ||
|
1
|
||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
|
|||||
| 10.08.2011, 16:25 | |||||
0
|
|||||
|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
||
| 10.08.2011, 17:56 [ТС] | ||
|
2 easybudda - я все примеры тестирую на Ubuntu с g++ и Ваш пример у меня вывел два раза Vasya, как и у Вас на Debain и BSD.
0
|
||
| 10.08.2011, 17:56 | |
|
Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу? ООП - Указатели на функции члены класса Массив указателей на функции-члены класса
Использование указателей на функции-члены внутри самого класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|