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

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

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

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

10.07.2012, 18:54. Просмотров 4450. Ответов 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
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 19:04 #31
Цитата Сообщение от Jupiter Посмотреть сообщение
ассертов конечно можно, но это не всегда хороший выход из ситуации
Я только про те ситуации, когда параметр обязателен и 0 передавать низя.) По мне так лучше ассерт, чем что либо иначе. Но, как я выше уже написал, я тоже ссылки предпочитаю. Но в отдельных, не зависимых модулях, ссылки стараюсь всё таки не использовать. ДАже не уверен, что это возможно, потому что ни разу таких dll не делал.))))
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,199
Записей в блоге: 27
12.07.2012, 19:07 #32
Цитата Сообщение от Deviaphan Посмотреть сообщение
Я только про те ситуации, когда параметр обязателен и 0 передавать низя.)
В этом случае всё равно сломается на обращении по кривому адресу, а выявить проблему труда не составляет. Т.е. конкретно этот assert он скорее для красоты, чем для спасения мира
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.07.2012, 19:20 #33
Цитата Сообщение от Evg Посмотреть сообщение
А проблема-то в чём? А то может мы о разных вещах говорим
ссылка и указатель как параметры функции, а проблема в том что код пишем не на один день и значит нужно принять "фундаментальное" решение о реакции на невалидный указатель

Не по теме:

Цитата Сообщение от Deviaphan Посмотреть сообщение
ДАже не уверен, что это возможно, потому что ни разу таких dll не делал.))))
мб я неточно выразился говоря модуль, что ж конкретизируем до хедер файла



Цитата Сообщение от Deviaphan Посмотреть сообщение
По мне так лучше ассерт, чем что либо иначе.
а что иначе? иначе только заставить передавать гарантировано инициализированный объект по ссылке
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.07.2012, 19:24 #34
Jupiter, а в чём проблема-то всё-таки? Ссылку тоже можно инициализировать невалидным объектом.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
12.07.2012, 19:27 #35
Цитата Сообщение от Jupiter Посмотреть сообщение
а что иначе?
if и какой-нибудь возврат из функции. Или исключение. Но тут такая ошибка, что только на ассерт согласен.)

Цитата Сообщение от Jupiter Посмотреть сообщение
передавать гарантировано инициализированный объект по ссылке
Потому я и использую ссылки.
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.07.2012, 19:46 #36
Цитата Сообщение от silent_1991 Посмотреть сообщение
а в чём проблема-то всё-таки?
проблема в этом:
Цитата Сообщение от Deviaphan Посмотреть сообщение
if и какой-нибудь возврат из функции. Или исключение. Но тут такая ошибка, что только на ассерт согласен.)
чего можно избежать используя ссылку

Цитата Сообщение от silent_1991 Посмотреть сообщение
Ссылку тоже можно инициализировать невалидным объектом.
можно, но это уже будут проблемы того парня который инициализировал)
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,199
Записей в блоге: 27
12.07.2012, 20:14 #37
Цитата Сообщение от Jupiter Посмотреть сообщение
ссылка и указатель как параметры функции, а проблема в том что код пишем не на один день и значит нужно принять "фундаментальное" решение о реакции на невалидный указатель
Мне кажется, что тут вполне можно ограничиться тем, что написать в документации, что если ты злобный буратино, то библиотеку не используй. Т.е. если функция принимает параметр "struct trampampam*", то подсунув туда указатель на другой объект, получишь ошибку компиляции. А если сделаешь явное преобразование указателей, то ты и есть буратино.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Ссылку тоже можно инициализировать невалидным объектом
А как? Мне казалось, что ссылки как раз и создавались для того, чтобы средствами языка их нельзя было инициализировать левотой. Хакерские методы не в счёт

Добавлено через 5 минут
На всякий случай. У меня слишком маленький опыт работы на Си++, а потому всё то, что я сказал - это всего лишь частное мнение, но НЕ экспертный взгляд
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 20:36 #38
Цитата Сообщение от silent_1991 Посмотреть сообщение
Таким образом, скрытое изменение параметра в том случае, когда программист об этом не подозревает, можно считать плохим тоном.
не очень понимаю что тут скрытого..
передаем встроенный тип T - по значению (..., T t, ..)
передеем изменяемый - по ссылке (..., T& t, ..)
неизменяемый (..., const T& t, ..)
что неочевидного для пользователя?

Цитата Сообщение от Evg Посмотреть сообщение
А как? Мне казалось, что ссылки как раз и создавались для того, чтобы средствами языка их нельзя было инициализировать левотой. Хакерские методы не в счёт
подразумевается, что какойто имбецил напишет T& t = *((T*)NULL)
2
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.07.2012, 20:41 #39
alex_x_x, не очевиден вызов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void print(int& a)
{
    std::cout << a << std::endl;
    
    a = 100500;
}
 
//...
 
int x = 10;
 
print(x);
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.

Добавлено через 1 минуту
Evg, не знаю, стоит ли считать каст в стиле Си (или reinterpret_cast) хакерством, но многие пейсатели любят юзать подобные штуки, не задумываясь о последствиях. Причём в продакшн-коде.
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.07.2012, 20:53 #40
Цитата Сообщение от Evg Посмотреть сообщение
Мне кажется, что тут вполне можно ограничиться тем, что написать в документации, что если ты злобный буратино, то библиотеку не используй. Т.е. если функция принимает параметр "struct trampampam*", то подсунув туда указатель на другой объект, получишь ошибку компиляции. А если сделаешь явное преобразование указателей, то ты и есть буратино.
можно, вот только не факт что туда кто-то заглянет(а если заглянет, заметит!?), тогда как сигнатуру функции на 99.9% посмотрят
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
указатели на константу не учитываем, всё равно придется глядеть сигнатуру)
0
Evg
Эксперт CАвтор FAQ
18026 / 6258 / 427
Регистрация: 30.03.2009
Сообщений: 17,199
Записей в блоге: 27
12.07.2012, 21:30 #41
Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, не знаю, стоит ли считать каст в стиле Си (или reinterpret_cast) хакерством, но многие пейсатели любят юзать подобные штуки, не задумываясь о последствиях. Причём в продакшн-коде
Любое преобразование типов над указателями я считаю буратинством. При таком раскладе и на const в общем случае нельзя положиться

Цитата Сообщение от Jupiter Посмотреть сообщение
можно, вот только не факт что туда кто-то заглянет(а если заглянет, заметит!?), тогда как сигнатуру функции на 99.9% посмотрят
Когда стоит "func (&x)", то при определённых соглашениях даже смотреть никуда не надо, ибо надо исходить из того, что переменная будет модифицироваться
0
Catstail
Модератор
22711 / 11080 / 1795
Регистрация: 12.02.2012
Сообщений: 18,272
12.07.2012, 21:49 #42
В С/C++ есть хорошее ключевое слово: BREAK !!!
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.07.2012, 23:15 #43
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
ну не знаю, не видя полной сигнатуры функции с именами параметров все равно бывает сложно что-то сказать о функции

Добавлено через 19 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
В С/C++ есть хорошее ключевое слово: BREAK !
а еще continue
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3139 / 307
Регистрация: 04.12.2011
Сообщений: 8,661
Записей в блоге: 5
13.07.2012, 15:37 #44
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
А если в функции нет обращения, а только выбор и возврат:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int* foo(int* a, int* b, int c);//декл
 
//----------------------------------
//вызов:
int a[3]={1};
int b[3]={5};
cout<<foo(a, b, 0); //что в месте вызова видно?
 
//--------------------
//опр
int* foo(int* a, int* b, int c){
if(c) return a;
return b;
}
Согласен с alex_x_x, - если у програмера есть руки, вероятность их кривизны не равна нулю. Особенно если не смотреть, хотя бы сигнатуру.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 16:34 #45
Цитата Сообщение от IGPIGP Посмотреть сообщение
А если в функции нет обращения, а только выбор и возврат:
Пример с массивом не корректен, т.к. он всегда как указатель передаётся. А вот если использовать объекты:
C++
1
2
3
4
5
6
7
8
9
10
11
A* func1( A* a, A *b, int c );
 
A& func2(A&a, A&b, int c)
{
    return c ? a : b;
}
 
A a,b;
 
cout << *func1(&a,&b,0);
cout << func2(a,b,0);
0
13.07.2012, 16:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 16:34
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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