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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

Передача параметра по константной ссылке - что это? - C++

26.07.2014, 17:34. Просмотров 1252. Ответов 31
Метки нет (Все метки)

объясните мне пожалуйста что такое передача параметра в функцию по константной ссылке? я просто вообще не могу представить что значит & в параметре функции... 2 года как изучаю си, а такое увидел только недавно... & это же операция взятия адреса, я ее знаю только так... но как она может быть параметром убей не пойму...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 17:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача параметра по константной ссылке - что это? (C++):

Передача по константной ссылке - C++
void print(const std::string strs, const char c); void print(const std::vector<std::string>& vstrs, const char c); Нужно организовать...

Передача std::string по константной ссылке \ значению - C++
Суть вопроса: есть простенький словарь с std::vector в качестве приватного поля. struct StudentGrade { std::string name; char...

Передача параметра по ссылке - C++
Здравствуйте! Подскажите пожалуйста! Делаю пример из книги: #include <iostream> #include <conio.h> using namespace...

Передача параметра по ссылке - C++
Всем доброго времени суток. Понимаю что вопрос покажется очень глупым, но я уже несколько часов бьюсь и не могу решить эту элементарную...

Передача параметра по ссылке - C++
Всем здравствуйте. Други, помогите разобраться. Сидю :) вникаю в работу указателей и памяти, паралельно пытаюсь написать велосипед, в...

Аллокация памяти при передаче string в функцию по константной ссылке - C++
Поясните пожалуйста данный пример: // C++11 #include <string> void get_vendor_from_id(const std::string& id) { // аллоцирует память,...

31
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
26.07.2014, 19:13  [ТС] #16
Цитата Сообщение от Voivoid Посмотреть сообщение
Ссылка не может быть нулевая.
ок
Цитата Сообщение от Voivoid Посмотреть сообщение
Ссылку нельзя переназначить
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Переменная, переданная по константной ссылке, не может быть изменена в вызываемой функции, по не константной может, при этом изменения будут видны после выхода из функции, в отличие от переменной, переданной по значению.
а вот тут че то не стыкуется...
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
26.07.2014, 19:14 #17
Цитата Сообщение от GetHelp Посмотреть сообщение
а вот тут че то не стыкуется..
Через неконстантную ссылку можно изменить значение объекта, но нельзя заставить ссылку начать ссылаться на другой объект.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.07.2014, 19:15 #18
Цитата Сообщение от GetHelp Посмотреть сообщение
а вот тут че то не стыкуется...
Нельзя изменить адрес, на который указывает ссылка, значение по этому адресу - можно для не константной ссылки.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
26.07.2014, 19:16  [ТС] #19
ага кажется понял... но вообще какой плюс использования ссылок? по сравнению с указателями
Цитата Сообщение от GetHelp Посмотреть сообщение
мне тут что то говорили про то что такой способ передачи лучше чем простая передача, типа тут копирования лишнего не происходит, о чем это вообще?
0
S_el
2109 / 1628 / 308
Регистрация: 15.12.2013
Сообщений: 6,491
26.07.2014, 19:18 #20
Цитата Сообщение от GetHelp Посмотреть сообщение
ага кажется понял... но вообще какой плюс использования ссылок? по сравнению с указателями
Проще для понимания,передал по ссылке и работаешь как с обычной переменной.
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
26.07.2014, 19:19 #21
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от GetHelp Посмотреть сообщение
но вообще какой плюс использования ссылок? по сравнению с указателями
Более безопасный код. Следствие из отсутствия null-семантики.
Более компактный код - отсутствие синтаксиса для разыменования.

Цитата Сообщение от GetHelp Посмотреть сообщение
типа тут копирования лишнего не происходит
При передаче большого объекта по значению все его содержимое копируется - по-моему, интуитивно понятный факт.
1
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
26.07.2014, 19:22  [ТС] #22
нет вот эти два товарища точно были уверены что со ссылкой будет работать быстрее... вот мне и стало интересно что же это такое... Стек на шаблонах - оцените реализацию и Стек на шаблонах - оцените реализацию
0
S_el
26.07.2014, 19:23
  #23

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
нет вот эти два товарища точно были уверены что со ссылкой будет работать быстрее...
Почему бы не спросить у них?

0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
26.07.2014, 19:23 #24
Цитата Сообщение от GetHelp Посмотреть сообщение
нет
Что "нет"? Одна из ссылок на мой пост, и выше про копирование я повторил.
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
26.07.2014, 19:24 #25
Цитата Сообщение от GetHelp Посмотреть сообщение
ссылкой будет работать быстрее...
Ясен пень - при передаче по значению создается копия объекта передаваемого параметром, при передаче по ссылке - передается только его адрес.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 08:23  [ТС] #26
Цитата Сообщение от 0x10 Посмотреть сообщение
При передаче большого объекта по значению все его содержимое копируется - по-моему, интуитивно понятный факт.
ага... ну мне это не было понятно... все кажется больше вопросов нет спс всем...

Добавлено через 12 часов 10 минут
так просто вдруг кому еще интересна эта тема будет нашел классную статью

Добавлено через 48 минут
а вот и возник еще один вопрос, вот код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <typename T>
void swap(T& a, T& b)
{
    T tmp = a;
    a = b;
    b = tmp;
}
 
void main()
{
    int a = 10, b;
    swap(a, b);
}
и что интересно он работает... хотя вроде как не бывает нулевых ссылок... ни ошибок ничего, в дебаггере глянул: реально a присваивается NULL, b присваивается 10... как это объяснить?
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
27.07.2014, 08:26 #27
Первый аргумент функции ссылается на переменную a, второй - на неинициализированную переменную b.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 08:27  [ТС] #28
Цитата Сообщение от 0x10 Посмотреть сообщение
Первый аргумент функции ссылается на переменную a, второй - на неинициализированную переменную b.
ну и? так ведь выходит что b раз она не инициализирована равна NULL
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
27.07.2014, 08:30 #29
Цитата Сообщение от GetHelp Посмотреть сообщение
ну и? так ведь выходит что b раз она не инициализирована равна NULL
b - переменная, у которой есть адрес в памяти. Следовательно, на нее можно ссылаться независимо от ее значения.

В случае с указателями допустимо было бы передать ноль - т.е. указатель не указывал бы никуда, разыменовывать его было бы небезопасно, и функция swap упала бы на разыменовании нулевого указателя.
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2014, 17:16 #30
Цитата Сообщение от GetHelp Посмотреть сообщение
нашел классную статью
Странная, мягко говоря, статья. Один из перлов:
Вывод этой статьи очень прост. В языке си указатели надо использовать тогда и только тогда, если наш объект будет всегда существовать и нам не потребуется с помощью этой же ссылки получить доступ к другому объекту. Соответственно указатели следует использовать в противоположных случаях!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 17:16
Привет! Вот еще темы с ответами:

Как сделать доступным обращение к методу параметра, объявленного константной ссылкой? - C++
Ругается на строку, содержащую присваивание локальной переменной значения метода параметра, объявленного константной ссылкой. Метод...

Что это за знак >> прочитал что это сдвиг вправо? что он делает - C++
int d=6, c=5,f; f = d &gt;&gt; c; cout&lt;&lt; f; вывод 0

Как получить адрес параметра, передоваемого по ссылке? - C++
подскажите как получить адрес параметра, передоваемого по ссылке? void f(int &amp;a...) { int *p = ????; for(int i = 0; i &lt; 3;...

Передача по ссылке - C++
Здравствуйте. 1.typedef struct { MATRIXX_LENTA&lt;double&gt;* MATR; //Ленточная матрица } DATA_LENTA, *PDATA_LENTA; DWORD WINAPI...


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

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

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