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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 539
#1

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

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

Здравствуйте, позвольте я задам вопрос по С++
1)
C++
1
2
3
4
void Class::set(const int & i)
{
qwerty = i;
}
Зачем в случае присваивания делают ссылку/указатель на аргумент константным
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2011, 17:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Зачем в случае присваивания делают ссылку/указатель на аргумент константным (C++):

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

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

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

Перегружаемый оператор присваивания, зачем нужен амперсанд? - C++
Вот программа: #include <iostream> using namespace std; class alpha { private: int data; public: alpha(){}

Зачем использовать Указатель на указатель? - C++
Подскажите зачем использовать Указатель на указатель? И как работают двумерные массивы за счет указателей?

Указатель массива как аргумент функции - C++
Я прочитал несколько алгоритмов сортировки массивов, но не совсем понял, если массив чисел будет передан в аргумент функции через...

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

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

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

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

В большинстве случаев за это руки надо отрывать
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
0
fasked
Эксперт С++
4942 / 2522 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2011, 17:22 #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Тем не менее большинство стандартных С функций для работы со строками построены именно по такому принципу! В них передается константный указатель на исходную строку, а затем внутри функции при возвращении значения на эту же строку константность убирается! Если память не изменяет, то посмотрите, например, определение функции strchr в стандарте языка С.
Эти функции не изменяют значение по указателю, что уже не так страшно
Тут уже виноваты возможности языка. Собственно подобные функции часто используются, чтобы "найти и заменить", поэтому возвращаемый указатель должен быть неконстантным. Для поиска естественно использовать константный указатель. Как иначе обеспечить подобное поведение функции в языке Си, лично я не знаю Но С++ в этом плане более строгий, а мы говорим о Си++
0
Сыроежка
Заблокирован
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;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 17:24
Привет! Вот еще темы с ответами:

Аргумент функции - указатель на метод класса - C++
Здравствуйте. Содержание задания - написать программу, создающую копию выбранного пользователем файла при помощи n-го кол-ва потоков...

Указатель на функцию с аргументами, как аргумент другой функции - C++
У меня есть некая функция, которая принимает как аргумент другую функцию typedef void(*func_type)(); start(func_type...

Указатель на ссылку - C++
Чем отличается указатель от указателя на ссылку??

Зачем нужно возвращать ссылку на объекты потоковых типов? - C++
В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать операции ввода-вывода, надо возвращать ссылку на объект...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
05.08.2011, 17:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru