Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
hepr
 Аватар для hepr
60 / 32 / 5
Регистрация: 21.10.2010
Сообщений: 538
04.08.2011, 17:45     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #1
Здравствуйте, позвольте я задам вопрос по С++
1)
C++
1
2
3
4
void Class::set(const int & i)
{
qwerty = i;
}
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2011, 17:45     Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Посмотрите здесь:

C++ Указатель на ссылку
C++ Аргумент функции - указатель на метод класса
C++ Как получить ссылку на указатель или указатель на указатель в массиве?
Создание полиморфного объекта, зачем создавать указатель на объект базового класса? C++
Реализация двоичных деревьев поиска: Зачем в параметрах функции используется указатель на указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
04.08.2011, 17:49     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #2
Цитата Сообщение от hepr Посмотреть сообщение
Здравствуйте, позвольте я задам вопрос по С++
1) void Class::set(const int & i)
{
qwerty = i;
}
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
В данном конкретном случае передача int по ссылке и даже по константной ссылке бессмысленно!

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

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

C++
1
2
void Class::set(const int & i)
void Class::set( int  i)
семантически идентичны. Более того именно передача по константной ссылке не гарантирует, что переменная в коде функции не будет изменена, так как можно сделать приведение типов и освободиться от константности!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.08.2011, 16:28     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #5
Сыроежка, А это уже дело программиста. + к тому функция может быть изменена. Но int действительно нет резона передавать по const ссылке.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2011, 16:53     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #6
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть эти два варианта
Да я больше в общем говорю, как всегда .
Мне почему-то показалось, что ТС имел в виду аргумент любого типа, просто пример привел неудачный. А так-то само собой разницы нет.
Цитата Сообщение от Сыроежка Посмотреть сообщение
так как можно сделать приведение типов и освободиться от константности!
В большинстве случаев за это руки надо отрывать
Сыроежка
Заблокирован
05.08.2011, 16:59     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #7
Цитата Сообщение от fasked Посмотреть сообщение
Д

В большинстве случаев за это руки надо отрывать
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.08.2011, 17:22     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
Эти функции не изменяют значение по указателю, что уже не так страшно
Тут уже виноваты возможности языка. Собственно подобные функции часто используются, чтобы "найти и заменить", поэтому возвращаемый указатель должен быть неконстантным. Для поиска естественно использовать константный указатель. Как иначе обеспечить подобное поведение функции в языке Си, лично я не знаю Но С++ в этом плане более строгий, а мы говорим о Си++
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 17:24     Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Еще ссылки по теме:

Зачем нужно возвращать ссылку на объекты потоковых типов? C++
Зачем использовать Указатель на указатель? C++
Сортировка через ссылку на (указатель на указатели) C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
05.08.2011, 17:24     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #9
Да, в С++ выкрутились из ситуации посредством перегрузки этих функций. На самом деле проблема более глубокая, чем кажется на первый взгляд.

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

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

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

C++
1
2
3
4
const char *cp = "что-то";
char *p;
 
p = cp;
Yandex
Объявления
05.08.2011, 17:24     Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Ответ Создать тему
Опции темы

Текущее время: 03:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru