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

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

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

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

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

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

C++ Указатели и ссылки
C++ Ссылки и указатели
C++ Ссылки и указатели
C++ Указатели и ссылки [С++]
Указатели и Ссылки C++
C++ Указатели и ссылки
Указатели и ссылки? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17183 / 5437 / 336
Регистрация: 30.03.2009
Сообщений: 14,742
Записей в блоге: 26
12.07.2012, 21:30     Ссылки vs Указатели #41
Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, не знаю, стоит ли считать каст в стиле Си (или reinterpret_cast) хакерством, но многие пейсатели любят юзать подобные штуки, не задумываясь о последствиях. Причём в продакшн-коде
Любое преобразование типов над указателями я считаю буратинством. При таком раскладе и на const в общем случае нельзя положиться

Цитата Сообщение от Jupiter Посмотреть сообщение
можно, вот только не факт что туда кто-то заглянет(а если заглянет, заметит!?), тогда как сигнатуру функции на 99.9% посмотрят
Когда стоит "func (&x)", то при определённых соглашениях даже смотреть никуда не надо, ибо надо исходить из того, что переменная будет модифицироваться
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21784 / 10508 / 1705
Регистрация: 12.02.2012
Сообщений: 17,510
12.07.2012, 21:49     Ссылки vs Указатели #42
В С/C++ есть хорошее ключевое слово: BREAK !!!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.07.2012, 23:15     Ссылки vs Указатели #43
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
ну не знаю, не видя полной сигнатуры функции с именами параметров все равно бывает сложно что-то сказать о функции

Добавлено через 19 секунд
Цитата Сообщение от Catstail Посмотреть сообщение
В С/C++ есть хорошее ключевое слово: BREAK !
а еще continue
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6346 / 2993 / 295
Регистрация: 04.12.2011
Сообщений: 8,029
Записей в блоге: 3
13.07.2012, 15:37     Ссылки vs Указатели #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, - если у програмера есть руки, вероятность их кривизны не равна нулю. Особенно если не смотреть, хотя бы сигнатуру.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 16:34     Ссылки vs Указатели #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);
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.07.2012, 17:05     Ссылки vs Указатели #46
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
Вызывая функцию, ты должен точно знать её назначение, а из него в любом случае будешь знать не только об изменении параметра, но и о характере этого изменения. А иначе опасна и передача по значению и даже вызов функции без параметров.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6346 / 2993 / 295
Регистрация: 04.12.2011
Сообщений: 8,029
Записей в блоге: 3
13.07.2012, 19:15     Ссылки vs Указатели #47
Цитата Сообщение от Deviaphan Посмотреть сообщение
Пример с массивом не корректен, т.к. он всегда как указатель передаётся.
Почему же некорректен? В месте вызова не видать ничего. А кто помешает в функции написать a=b; перед возвратом или a=b+10000; . Никто и не помешает.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 19:22     Ссылки vs Указатели #48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему же некорректен?
Потому что массив по значению не передаётся.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
13.07.2012, 22:37     Ссылки vs Указатели #49
Цитата Сообщение от novi4ok Посмотреть сообщение
принципиальной разницы нет. просто другая форма записи. все равно при использовании ссылки на самом деле указатель передается. я предпочитаю ссылками не пользоваться, но когда у кого-то в ф-ии встречается - не имею проблем.
Ну это не так. Под ссылку даже память может не выделяться, она также не может иметь своего адреса, к ней не применим const, нельзя применить ссылку на ссылку и др.комбинации.Единственное что можно зделать - инициализировать.
Думаю что достаточно различий что бы не говорить что ссылка это тот же указатель.

Добавлено через 10 минут
Потому что массив по значению не передаётся.
Зато можно по ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//----------------------------------
void f(int (&A)[10] )
{
 A[5]=55;
}
//----------------------------------
int main()
{
int A[10],B[11];
 
f(A);
//f(B);  // Ошибка не тот размерчик :)
 
cout<<A[5]<<endl; // 55
 
return 0;
}
//----------------------------------
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6346 / 2993 / 295
Регистрация: 04.12.2011
Сообщений: 8,029
Записей в блоге: 3
13.07.2012, 23:14     Ссылки vs Указатели #50
Цитата Сообщение от Avazart Посмотреть сообщение
Ну это не так. Под ссылку даже память может не выделяться, она также не может иметь своего адреса, к ней не применим const, нельзя применить ссылку на ссылку и др.комбинации.Единственное что можно зделать - инициализировать.
Avazart, тут и спора нет. Ссылка не тот же указатель, но ведет себя как указатель с урезанными правами. Она const по определению, поэтому и не стоит ее объявлять как константу, а ссылаться на константу вполне может. Но везде где используется ссылка может быть использован указатель, но с дополнительными операциями * разименования. На ооборот - нет. Но смысл ссылки, как она задумана, в доступе к значению. Удобство в том, что если требуется адрес она автоматически предоставляет адрес без *. Но ведь указатель же может быть передан и для работы с указателем как таковым?
Deviaphan, массивы передаются по ссылке. Ну и что? А объекты которые созданы через указатели:
C++
1
A* b = new A();
Легко переписать:
A* foo(A* a, A* b, int c);//декл

//----------------------------------
//вызов:
C++
1
2
3
4
5
6
7
8
9
10
A* a = new A();
A* b = new A();
cout<<foo(a, b, 0); //что в месте вызова видно?
 
//--------------------
//опр
A* foo(A* a, A* b, int c){
if(c) return a;
return b;
}
смысл в том же, - функция получает указатели на тип, что бы вернуть один из них (или переустановить) но без доступа к значениям. Тогда внутри неё используются только имена формальных параметров и понять в месте объявления ничего не выйдет.
Мой опыт и знания не представляют ничего серьёзного и вопросы я задаю, для более глубокого понимания.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
13.07.2012, 23:33     Ссылки vs Указатели #51
Если размер объекта не больше размера указателя, то смысла применять указатель для повышения скорости работы нет.

Ну и конструкция
C++
1
int const *const
сильно грамосткая
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 06:29     Ссылки vs Указатели #52
Цитата Сообщение от IGPIGP Посмотреть сообщение
массивы передаются по ссылке. Ну и что?
Массивы ВООБЩЕ невозможно передать по значению. Синтаксис передачи по ссылке эквивалентен передаче по значению, поэтому такой пример не корректен был.

Добавлено через 42 секунды
Цитата Сообщение от Avazart Посмотреть сообщение
к ней не применим const
В смысле???
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
14.07.2012, 06:32     Ссылки vs Указатели #53
В смысле???
В том смысле что он влияет на переменную, а не на саму ссылку.
Массивы ВООБЩЕ невозможно передать по значению. Синтаксис передачи по ссылке эквивалентен передаче по значению, поэтому такой пример не корректен был.
Это почему же?
(Хотя какой конкретно пример имеется ввиду?)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 06:36     Ссылки vs Указатели #54
Цитата Сообщение от Avazart Посмотреть сообщение
В том смысле что он влияет на переменную, а не на саму ссылку.
Ке?
C++
1
2
3
int a = 5;
const int & b = a;
a = 7;
Где влияние на переменную?

Цитата Сообщение от Avazart Посмотреть сообщение
Хотя какой конкретно пример имеется ввиду?
Тот, пример которого я переделал много постов тому назад.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
14.07.2012, 06:44     Ссылки vs Указатели #55
Ну в данном случае- игнор, а в этом- нет
C++
1
2
3
4
void f( const int& a )
 {
   a=10;
 }
И в этом
C++
1
int & const a= b ;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 07:28     Ссылки vs Указатели #56
А где влияние на переменную? В обоих случаях это const ссылки.
В отличие от константного указателя и указателя на константу, константная ссылка и ссылка на константу это одно и то же.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
14.07.2012, 11:05     Ссылки vs Указатели #57
Ну либо выражение константная ссылка просто не отражает смысл также как
C++
1
const_iterator
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 11:18     Ссылки vs Указатели #58
Цитата Сообщение от Avazart Посмотреть сообщение
также как
Не так же. Пример с указателем приведён был выше. В частных случаях итератор и указатель равнозначны. Константная ссылка и ссылка на константу это одно и то же.
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,908
Записей в блоге: 17
14.07.2012, 11:24     Ссылки vs Указатели #59
Также нелепо по тому как пишится const_iterator, а подразумевается итератор на константу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 11:27     Ссылки vs Указатели
Еще ссылки по теме:

Указатели и ссылки C++
C++ Указатели и ссылки c++
Указатели и ссылки C++
C++ Ссылки, указатели
Ссылки и указатели C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
14.07.2012, 11:27     Ссылки vs Указатели #60
Avazart, Ничего нелепого. В большинстве случаев это разные классы, которые по разному используются (в частности методы ->, * могут быть реализованы по разному и в const_iterator должны быть константами и возвращающими константу), как бы вы тогда назвали const_iterator, если такое название по вашему нелепо?
Yandex
Объявления
14.07.2012, 11:27     Ссылки vs Указатели
Ответ Создать тему
Опции темы

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