|
155 / 155 / 44
Регистрация: 03.11.2010
Сообщений: 393
|
|||||||||||
Константные функции-члены класса, возвращающие ссылку на константу08.08.2011, 21:09. Показов 13172. Ответов 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,980
|
|
| 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,980
|
||||||
| 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,980
|
|||||||
| 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,980
|
|
| 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,980
|
||
| 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,980
|
|||||
| 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 | |
|
Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу? ООП - Указатели на функции члены класса Массив указателей на функции-члены класса
Использование указателей на функции-члены внутри самого класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
|