С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для hepr
63 / 35 / 13
Регистрация: 21.10.2010
Сообщений: 538

Зачем в случае присваивания делают ссылку/указатель на аргумент константным

04.08.2011, 17:45. Показов 2225. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, позвольте я задам вопрос по С++
1)
C++
1
2
3
4
void Class::set(const int & i)
{
qwerty = i;
}
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.08.2011, 17:45
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Зачем делают каталоги?
Вопрос простой - для чего нужны каталоги, какую пользу они приносят своим владельцам?

Зачем нужен указатель на указатель при работе с однонаправленным списком?
День добрый. Столкнулся с непониманием этой темы. В частности, совершенно непонятен алгоритм инициализации такого вот списка. Например:...

8
Заблокирован
04.08.2011, 17:49
Цитата Сообщение от hepr Посмотреть сообщение
Здравствуйте, позвольте я задам вопрос по С++
1) void Class::set(const int & i)
{
qwerty = i;
}
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
В данном конкретном случае передача int по ссылке и даже по константной ссылке бессмысленно!

Имеет смысл передавать по ссылке классы, так как при передачи их по значению вызываются конструкторы, которые влекут за собой накладные расходы. То есть при передаче класса по значению в качестве аргумента, во-первых, вызывается конструктор для создания копии значения, а при завершении функции вызывается деструктор этого класса.

Если вы не собираетесь в своей функции менять объект класса, то лучше передать его по константной ссылке. Размер ссылки, фактически, равен размеру int, то есть обычно занимает одно машинное слово, и никакие конструкторы и деструкторы не вызываются. А для объектов класса при передачи их по значению в стеке создается к тому же копия этого класса, а классы могут быть очень громоздкими!
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
04.08.2011, 22:50
Цитата Сообщение от hepr Посмотреть сообщение
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Гарантия (защита от) того, что передаваемый объект не будет изменен.
0
Заблокирован
05.08.2011, 16:25
Цитата Сообщение от fasked Посмотреть сообщение
Гарантия (защита от) того, что передаваемый объект не будет изменен.
А он в приведенном примере и так не будет изменен, если будет передан по значению!
То есть эти два варианта

C++
1
2
void Class::set(const int & i)
void Class::set( int  i)
семантически идентичны. Более того именно передача по константной ссылке не гарантирует, что переменная в коде функции не будет изменена, так как можно сделать приведение типов и освободиться от константности!
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
05.08.2011, 16:28
Сыроежка, А это уже дело программиста. + к тому функция может быть изменена. Но int действительно нет резона передавать по const ссылке.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
05.08.2011, 16:53
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть эти два варианта
Да я больше в общем говорю, как всегда .
Мне почему-то показалось, что ТС имел в виду аргумент любого типа, просто пример привел неудачный. А так-то само собой разницы нет.
Цитата Сообщение от Сыроежка Посмотреть сообщение
так как можно сделать приведение типов и освободиться от константности!
В большинстве случаев за это руки надо отрывать
0
Заблокирован
05.08.2011, 16:59
Цитата Сообщение от fasked Посмотреть сообщение
Д

В большинстве случаев за это руки надо отрывать
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
05.08.2011, 17:22
Цитата Сообщение от Сыроежка Посмотреть сообщение
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
Эти функции не изменяют значение по указателю, что уже не так страшно
Тут уже виноваты возможности языка. Собственно подобные функции часто используются, чтобы "найти и заменить", поэтому возвращаемый указатель должен быть неконстантным. Для поиска естественно использовать константный указатель. Как иначе обеспечить подобное поведение функции в языке Си, лично я не знаю Но С++ в этом плане более строгий, а мы говорим о Си++
0
Заблокирован
05.08.2011, 17:24
Да, в С++ выкрутились из ситуации посредством перегрузки этих функций. На самом деле проблема более глубокая, чем кажется на первый взгляд.

Рассмотрим ту же С-функцию strchr. Она объявляется примерно следующим образом

char * strchr( const char *s, int c );

ВЫ уже сказали, почему так делается. Но и это определение некорректное! Дело в том, что в функцию может передаваться строка, которая до этого была объявлена именно как константная! А мы из функции возвращаем на нее неконстантный указатель! То есть, фактически, имеет место следующий код:

C++
1
2
3
4
const char *cp = "что-то";
char *p;
 
p = cp;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.08.2011, 17:24
Помогаю со студенческими работами здесь

Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель
Всем привет, встретил в книге такой пример добавления узла в дерево: typedef struct tree { int data; tree *left, *right,...

Зачем иногда так делают?
Зачем иногда в классе реализуют возможность создать объект этого класса только через статический метод? Типа create или instanceOf.

Зачем люди делают каталоги?
Собственно, весь вопрос сформулирован. Ведь, во-первых, как я понял, Яндекс ведёт с ними борьбу. Во-вторых, в поддержку и модерацию...

Зачем и с какой целью это делают?!
У меня в магазине белья все статьи нельзя скопировать, только если через исходный код. Щас решила проверить есть ли умники такие и...

Зачем на современных сайтах делают кучу вложенных дивов ?
У меня уже есть достаточно большой опыт верстки и работы с вебом, но когда смотрю на чужой код, удивляюсь, зачем делать много вложенных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru