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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.82
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

Ссылки vs Указатели - C++

10.07.2012, 18:54. Просмотров 4393. Ответов 81
Метки нет (Все метки)

Почему ссылки считаются более хорошим средством, чем указатели?
Ведь если человек будет использовать сторонние классы, он может не заметить, скажем
int &val
и не будет знать, что передается ссылка, а вовсе не копия. Это может повлечь за собой кучу неприятностей. Даже сам разработчик может спустя время забыть о злополучном знаке &. Так почему ссылки лучше?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2012, 18:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ссылки vs Указатели (C++):

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

Указатели и ссылки - C++
Допустим, что есть функция, в которую мы кидаем массив по указателю и кол-ву элементов. void printArray(int *arr, int elements) ...

Ссылки, указатели - C++
Доброго времени. Как, используя ссылки, указатели и, возможно, другие приемы сделать что-то вроде этого?: int a = 1; int b = 2; ...

Ссылки и указатели - C++
Добрый день. Возможно было. В чем существенная разница между передачей данных в функцию по ссылке или указателю. В каких случаях вы бы...

Указатели и ссылки - C++
Экспериментируя с указателями пришел к вот таким выводам: int a; //переменная int *b; //указатель int &c = a //ссылка на <a> ...

Ссылки и указатели - C++
Добрый день, не могу понять чем помогают при использовании указатели и ссылки? Есть код на c++ #progma once class well { ...

81
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
11.07.2012, 01:05 #16
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Ага, кроме UB по стандарту, и segfolta по факту
это ты - матом? или что за слова нехорошие? обидеть хочешь?
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 01:17 #17
Это сарказм? Если нет, то UB - Undefined behavior, segfault - Segmentation fault и все это ждет при разыменовении нулевого указателя и попытки записи.

Добавлено через 4 минуты
Вот пример:
[development]$ cat segfault.cpp
int main() {
int* p = 0;
*p = 0;
}
[development]$ g++ segfault.cpp -o segfault
[development]$ ./segfault
Segmentation fault (core dumped)
0
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
11.07.2012, 01:34 #18
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
segfault - Segmentation fault и все это ждет при разыменовении нулевого указателя и попытки записи.
виндузятников ждет runtime exception
или как там
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.07.2012, 02:23 #19
alex_x_x, ага, но приятного все равно мало . Хотя, судя по определению из википедии, segfault он и в винде segfault.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
11.07.2012, 08:31 #20
Подытожим!

При передачи изменяемых объектов, используется указатель.
При передаче НЕ изменяемых объектов, используется константная ссылка.
При таком раскладе никто-никогда не забудет, что объект изменяется или не изменяется и все склеротики счастливы.
2
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.07.2012, 18:11 #21
Тоже добавлю, что кто-то из великих от плюсов (то ли Эккель, то ли Мейерс, то ли Саттер, а может кто-то ещё) советует в случае, если необходимо менять параметр, передаваемый в функцию, передавать этот параметр по указателю, чтобы программист при передаче такого параметра явно передавал адрес с помощью оператора &. Таким образом, скрытое изменение параметра в том случае, когда программист об этом не подозревает, можно считать плохим тоном.

Добавлено через 40 секунд

Не по теме:

Чёрт, а по факту-то сказал то же, что и Deviaphan... Ну да ладно, зато у меня в посте ещё три известных имени мелькает

2
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.07.2012, 18:19 #22
Цитата Сообщение от Ksan Посмотреть сообщение
он может не заметить, скажем
int &val
Каким образом?
Цитата Сообщение от Ksan Посмотреть сообщение
и не будет знать, что передается ссылка, а вовсе не копия. Это может повлечь за собой кучу неприятностей.
В чём здесь преимущество указателей? По ним тоже передаётся оригинал, а не копия, причём, ещё и удаляемый. а по ссылке не удаляемый. Добавлено через 25 секунд
Цитата Сообщение от Ksan Посмотреть сообщение
Даже сам разработчик может спустя время забыть о злополучном знаке &.
А при чём здесь вообще забывчивость? Читай прототип и будешь знать, что передаёшь. А если ты & модешь забыть, то тем более забудешь букву в имени.

Добавлено через 2 минуты
Цитата Сообщение от Ksan Посмотреть сообщение
да даже, к примеру
Код C++
1
func(int &a);
& легко не заметить.
Не возможно и не только здесь, но и в прототипах на шесть-восемь экранов в длину, а они всё таки встречаются не часто.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
12.07.2012, 18:24 #23
Цитата Сообщение от taras atavin Посмотреть сообщение
прототипах на шесть-восемь экранов в длину
мда
0
Evg
Эксперт CАвтор FAQ
17942 / 6173 / 411
Регистрация: 30.03.2009
Сообщений: 16,944
Записей в блоге: 27
12.07.2012, 18:26 #24
Цитата Сообщение от Deviaphan Посмотреть сообщение
При передачи изменяемых объектов, используется указатель.
При передаче НЕ изменяемых объектов, используется константная ссылка.
При таком раскладе никто-никогда не забудет, что объект изменяется или не изменяется и все склеротики счастливы.
Делаю именно так. Идея передавать модифицируемый объект по ссылке мне не нравится в принципе. И мне было пофигу, что кругом люди поступают именно так. Очень рад, что я не одинок в подобном мнении
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.07.2012, 18:29 #25
Ksan, ты функции на угад подбираешь, лишь бы параметры подошли? Тогда ты всё равно не сможешь программировать, так как при вызове функции надо точно знать, что именно она сделает, в том числе, как именно изменит параметр. А не изменит/не изменит. Ну а если переменная должна обнулиться, то в чём проблема? Ну передашь ты по значению и что? Параметр может и не изменится, но если ты функцию не знаешь, то она может много чего другого понаделать. В том числе, залезть в глобальную память и изменить переменные, которые ты не передавал.
0
Evg
Эксперт CАвтор FAQ
17942 / 6173 / 411
Регистрация: 30.03.2009
Сообщений: 16,944
Записей в блоге: 27
12.07.2012, 18:32 #26
taras atavin, классическая ошибка, вызванная предположением, что программы только пишут. Но на самом деле программы ещё и читают. В том числе и чужие программы
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.07.2012, 18:35 #27
Цитата Сообщение от Evg Посмотреть сообщение
Идея передавать модифицируемый объект по ссылке мне не нравится в принципе. И мне было пофигу, что кругом люди поступают именно так. Очень рад, что я не одинок в подобном мнении
Ни один разработчик функции, экспортируемой из библиотеки, в здравом уме не станет принимать и возвращать ссылки. Но почему нельзя их юзать внутри одной программы? Я по указателям передаю или массивы, или наружу, остальное ссылками. И не изменяемое тоже, пока не возникнет необходимость использования макросов и явных констант в фактических параметрах (именованными константами не пользуюсь вообще).

Добавлено через 40 секунд
Цитата Сообщение от Evg Посмотреть сообщение
taras atavin, классическая ошибка, вызванная предположением, что программы только пишут
Не моя.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 18:48 #28
Цитата Сообщение от Evg Посмотреть сообщение
Идея передавать модифицируемый объект по ссылке мне не нравится в принципе.
Мне нравится.) Если объект всегда необходимо передавать, то чаще именно ссылку использую. Экономия одного ассерта.)))
Но вариант с неконстантным указателем и константной ссылкой считаю более правильным и всем рекомендую к использованию.)

Добавлено через 1 минуту
Цитата Сообщение от taras atavin Посмотреть сообщение
но и в прототипах на шесть-восемь экранов в длину
Учитывая, что прототип это только имя функции и описание типов её аргументов, то я испытываю трепет от одной только мысли о размере реализации этой функции!

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
именованными константами не пользуюсь вообще
По идее, после этого любой диалог нужно прекращать.
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.07.2012, 18:53 #29
Deviaphan, silent_1991, Evg, отчасти с вами соглашусь, но как быть тому кто пишет отдельный независимый модуль, которым будут пользоваться другие? Понатыкать ассертов конечно можно, но это не всегда хороший выход из ситуации.
0
Evg
Эксперт CАвтор FAQ
17942 / 6173 / 411
Регистрация: 30.03.2009
Сообщений: 16,944
Записей в блоге: 27
12.07.2012, 19:02 #30
Цитата Сообщение от Deviaphan Посмотреть сообщение
Мне нравится.) Если объект всегда необходимо передавать, то чаще именно ссылку использую. Экономия одного ассерта.)))
Предпочитаю экономить время на поиск ошибок, в том числе и другими людьми, которые будут впервые в жизни видеть мой код. Логика простая "funx(x)" не меняет значение x, а "func (&x)" - меняет. Человек, читающий код, вникнет в проблемное место намного быстрее, если не будет изучать прототип (а то и реализацию) каждой встретившейся функции. Спичечные экономии на assert'ах не особенно и интересны.

Цитата Сообщение от Jupiter Посмотреть сообщение
но как быть тому кто пишет отдельный независимый модуль, которым будут пользоваться другие?
А проблема-то в чём? А то может мы о разных вещах говорим
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2012, 19:02
Привет! Вот еще темы с ответами:

Указатели и ссылки? - C++
Ниже приведёна программы которая вызывает функцию. В функции происходит следующее создаются 2 массива в которые записыватся чётные и...

Указатели и ссылки - C++
Используя вместо самой переменной указатель на нее написать программу в соответствии с заданием: Вычислить y = cos|x3-x2|.

Указатели и Ссылки - C++
извеняюсь,но никак не могу понять. int sum(int* inLeft, int* inRight) { if(inLeft == inRight) return *inLeft; ...

Указатели и ссылки - C++
Собственно, не могу до конца осознать как это работает, вот пример из вики(комменты входят в пример) int n = 6; // Объявление...


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

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

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