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

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

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

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

10.07.2012, 18:54. Просмотров 4399. Ответов 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
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.07.2012, 17:05 #46
Цитата Сообщение от silent_1991 Посмотреть сообщение
С указателем так не выйдет, в месте вызова явно видно, что передаётся адрес, и значение по адресу может быть изменено.
Вызывая функцию, ты должен точно знать её назначение, а из него в любом случае будешь знать не только об изменении параметра, но и о характере этого изменения. А иначе опасна и передача по значению и даже вызов функции без параметров.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
13.07.2012, 19:15 #47
Цитата Сообщение от Deviaphan Посмотреть сообщение
Пример с массивом не корректен, т.к. он всегда как указатель передаётся.
Почему же некорректен? В месте вызова не видать ничего. А кто помешает в функции написать a=b; перед возвратом или a=b+10000; . Никто и не помешает.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2012, 19:22 #48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему же некорректен?
Потому что массив по значению не передаётся.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,806
Записей в блоге: 17
13.07.2012, 22:37 #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;
}
//----------------------------------
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6486 / 3130 / 307
Регистрация: 04.12.2011
Сообщений: 8,644
Записей в блоге: 5
13.07.2012, 23:14 #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;
}
смысл в том же, - функция получает указатели на тип, что бы вернуть один из них (или переустановить) но без доступа к значениям. Тогда внутри неё используются только имена формальных параметров и понять в месте объявления ничего не выйдет.
Мой опыт и знания не представляют ничего серьёзного и вопросы я задаю, для более глубокого понимания.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,806
Записей в блоге: 17
13.07.2012, 23:33 #51
Если размер объекта не больше размера указателя, то смысла применять указатель для повышения скорости работы нет.

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

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

Цитата Сообщение от Avazart Посмотреть сообщение
Хотя какой конкретно пример имеется ввиду?
Тот, пример которого я переделал много постов тому назад.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,806
Записей в блоге: 17
14.07.2012, 06:44 #55
Ну в данном случае- игнор, а в этом- нет
C++
1
2
3
4
void f( const int& a )
 {
   a=10;
 }
И в этом
C++
1
int & const a= b ;
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 07:28 #56
А где влияние на переменную? В обоих случаях это const ссылки.
В отличие от константного указателя и указателя на константу, константная ссылка и ссылка на константу это одно и то же.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,806
Записей в блоге: 17
14.07.2012, 11:05 #57
Ну либо выражение константная ссылка просто не отражает смысл также как
C++
1
const_iterator
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2012, 11:18 #58
Цитата Сообщение от Avazart Посмотреть сообщение
также как
Не так же. Пример с указателем приведён был выше. В частных случаях итератор и указатель равнозначны. Константная ссылка и ссылка на константу это одно и то же.
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,806
Записей в блоге: 17
14.07.2012, 11:24 #59
Также нелепо по тому как пишится const_iterator, а подразумевается итератор на константу
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.07.2012, 11:27 #60
Avazart, Ничего нелепого. В большинстве случаев это разные классы, которые по разному используются (в частности методы ->, * могут быть реализованы по разному и в const_iterator должны быть константами и возвращающими константу), как бы вы тогда назвали const_iterator, если такое название по вашему нелепо?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2012, 11:27
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Yandex
Объявления
14.07.2012, 11:27
Ответ Создать тему
Опции темы

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