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

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

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

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

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

Здравствуйте, позвольте я задам вопрос по С++
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++
Вот программа: #include <iostream> using namespace std; class alpha { private: int data; public: alpha(){}

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

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

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

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

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

Создание полиморфного объекта, зачем создавать указатель на объект базового класса? - C++
Зачем создавать указатель на объект базового класса: Base *A = new Derived Если можно сделать так: Derived *A = new Derived

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

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

Если вы не собираетесь в своей функции менять объект класса, то лучше передать его по константной ссылке. Размер ссылки, фактически, равен размеру int, то есть обычно занимает одно машинное слово, и никакие конструкторы и деструкторы не вызываются. А для объектов класса при передачи их по значению в стеке создается к тому же копия этого класса, а классы могут быть очень громоздкими!
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
05.08.2011, 16:28     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #5
Сыроежка, А это уже дело программиста. + к тому функция может быть изменена. Но int действительно нет резона передавать по const ссылке.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.08.2011, 16:53     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #6
Цитата Сообщение от Сыроежка Посмотреть сообщение
То есть эти два варианта
Да я больше в общем говорю, как всегда .
Мне почему-то показалось, что ТС имел в виду аргумент любого типа, просто пример привел неудачный. А так-то само собой разницы нет.
Цитата Сообщение от Сыроежка Посмотреть сообщение
так как можно сделать приведение типов и освободиться от константности!
В большинстве случаев за это руки надо отрывать
Сыроежка
Заблокирован
05.08.2011, 16:59     Зачем в случае присваивания делают ссылку/указатель на аргумент константным #7
Цитата Сообщение от fasked Посмотреть сообщение
Д

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

Сортировка через ссылку на (указатель на указатели) - C++
Нужно, что бы функция принимала ссылку на указатель на много указателей,( и количество указателей, ясен пень.) И сортировала все ето,...

Указатель на ссылку или что это такое? - C++
void add(char aData, Branch *&aBranch); Речь об аргументе aBranch. Как это понимать? Указатель на ссылку? Не понятно. Вроде такое не...

Функция принимает ссылку на указатель. Куча ошибок - C++
Как правильно передать аргумент в функцию? Уже все способы перепробовал) #include <iostream> template<typename T> void...

Модификация объекта string через ссылку и указатель - C++
Создайте две функции: первая должна получать аргумент типа string*, вторая - srting&. Каждая функция должна изменять объект string своим...

Как сделать указатель/ссылку на метод конкретного экземпляра класса - 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     Зачем в случае присваивания делают ссылку/указатель на аргумент константным
Ответ Создать тему
Опции темы

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