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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

Указатели или ссылки (в качестве аргументов функции) ? - C++

23.05.2013, 10:23. Просмотров 2033. Ответов 55
Метки нет (Все метки)

В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
В общем поняла, что и те и другие полезны для ссылания на крупные обьекты типа классов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 10:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели или ссылки (в качестве аргументов функции) ? (C++):

Нюансы синтаксиса и семантики: ссылки, указатели и массивы в качестве аргументов функций - C++
Перенесено из этой темы. Чтобы вернуть указатели почему вот здесь не надо приводить janr к типу указателя char* на выходе? char*...

Указатели на массивы в качестве аргументов - C++
Помогите пожалуйста а то вообще идей никаких нет( Напишите функцию поиска минимального элемента в динамическом двухмерном массиве...

Константные указатели в качестве аргументов функций - C++
Вскрылся вот такой пробел в знаниях/понимании. Итак, есть предположим однонаправленный список (в общем без разницы что). struct TNode {...

С++ Тема «Указатели и динамические массивы. Использование указателей в качестве аргументов функций» - C++
В целочисленном массиве Х(N) удалить все элементы, расположенные между макси-мальным и минимальным элементами. Найти среднее арифметическое...

Идентификаторы списка в качестве аргументов функции - C++
Хочу организовать поиск по списку с помощью функции, в которую бы передавались: поле, по которому искать (собсно какая-то переменная из...

Использование массивов в качестве аргументов функции - C++
Написала программу, работает правильно, только не совсем по условию задачи. Помоги пожалуйста исправить. Условие: найти наибольшую...

55
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 10:30 #2
Цитата Сообщение от programina Посмотреть сообщение
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
23.05.2013, 10:35 #3
Если надо просто передать объект в функцию, то однозначно лучше ссылка на константу. Если надо внутри функции изменить аргумент, то тут спорно; есть один подход - для таких вещей всегда использовать указатели, что бы при вызове надо было брать адрес объекта - и это как бы намекает на изменение объекта внутри функции.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:47  [ТС] #4
Цитата Сообщение от Jupiter Посмотреть сообщение
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.

Добавлено через 10 минут
Липманн пишет, что если параметр ссылается на разные обьеты или ни на что не ссылается, то надо использовать указатели.
Обьясните как ни на что не ссылаться - что это означает?
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 10:51 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от programina Посмотреть сообщение
Обьясните как ни на что не ссылаться - что это означает?
C++
1
Type* ptr = 0; //ни на что не ссылается
Цитата Сообщение от programina Посмотреть сообщение
что если параметр ссылается на разные обьеты
C++
1
2
3
Type a, b;
Type* ptr = &a; //ссылается (указывает) на объект а
ptr = &b; //ссылается (указывает) на объект b
с ссылкой такие трюки не пройдут
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:54  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
с ссылкой такие трюки не пройдут
то есть ссылка фактически привязанный к обьекту указатель?
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 11:00 #7
Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
можно сказать и так
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:05  [ТС] #8
Jupiter, спасибо
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
23.05.2013, 11:06 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти, где может располагаться объект (а может уже и не располагаться).
Посему (имхо) безопаснее использовать ссылку, т.к. если нет объекта, то нет и ссылки, указатель (переменная содержащая адрес) может содержать в себе адрес несуществующего объекта.
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:12  [ТС] #10
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти.
Что значит "альтернативное имя" - это скопированный обьект или указатель на одну и тут же область памяти?
Не будет ли неэффективным использовать ссылки на массивные обьекты если окажется, что ссылка есть копия обьекта? Противоречие какое-то
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
23.05.2013, 11:22 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ссылка хранит адрес объекта, поэтому можешь рассматривать ее, как неизменяемый указатель.
Цитата Сообщение от programina Посмотреть сообщение
если окажется, что ссылка есть копия обьекта
Что значит "если окажется"? Если сомневаешься, то компилируй код и посмотри, какой ассемблерный код получился. Копии не будет. Ну, либо конструктор копирования напиши, сделай ссылку на объект и посмотри, вызовется ли конструктор копирования. Если бы это была копия, то ссылки были бы неэффективны.

Добавлено через 5 минут
Цитата Сообщение от oxotnik Посмотреть сообщение
Посему (имхо) безопаснее использовать ссылку, т.к. если нет объекта, то нет и ссылки
Да. Хотя, и глупостью можно заняться тоже
C++
1
2
3
    int *a=NULL;
    int &b = *a;
    b=10
2
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:26  [ТС] #12
oxotnik, Vourhey, спасибо.

Добавлено через 4 минуты
тема отправляется в закладки
0
oxotnik
1590 / 1067 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
23.05.2013, 11:31 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от programina Посмотреть сообщение
это скопированный обьект
скопированный объект, это уже отдельный объект
int a = 10; // a - имя объекта
int &b = a; // b - альтернативное имя объекта a, т.е. объект тот же самый, только в данном контексте называется b

Цитата Сообщение от programina Посмотреть сообщение
что ссылка есть копия обьекта?
Ссылка не есть копия объекта, это есть тот же самый объект.
Т.е. к примеру у человека есть имя Иван и есть его кличка Лысый, оба эти имени указывают на одного и того же человека. "Лысый" его альтернативное имя.

Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Vourhey Посмотреть сообщение
Хотя, и глупостью можно заняться тоже
Дай дураку стеклянный х..., он и его разобъет, и руки порежет.

4
Croessmah
Эксперт CЭксперт С++
13510 / 7668 / 866
Регистрация: 27.09.2012
Сообщений: 18,866
Записей в блоге: 3
Завершенные тесты: 1
23.05.2013, 12:34 #14
Цитата Сообщение от programina Посмотреть сообщение
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.
не в этом случае.

Что же, внесу и свое словечко.
Для передачи в функции лучше, наверное, использовать механизм ссылок для упрощения синтаксиса.
Если const-ссылка, то переданный объект не изменяется в функции, если обычная, то может измениться.
Для ссылок также как и для указателей доступен полиморфизм.
Ссылка более безопасна в том плане, что не может быть пустой(ни на что не ссылаться), хотя если иметь совсем кривые руки, то и это не спасет.

Лично мое мнение - указатели нужно использовать только внутри своих объектов и функций, а общение с "внешним миром" производить с помощью ссылок
2
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
23.05.2013, 14:29 #15
Vourhey,
C++
1
2
int *a=NULL;
    int &b = *a;
UB ж.
1
23.05.2013, 14:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 14:29
Привет! Вот еще темы с ответами:

Ostream и ofstream в качестве аргументов полиморфной функции - C++
Здравствуйте! Перегрузил оператор << с ostream и ofstream для пользовательского класса. ofstream &operator << (ofstream &output,...

Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов - C++
Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов. Если аргумент только один,...

функции,указатели и ссылки. - C++
Всем привет! Задали простецкую задачу. решите пожалуйста Написать программу в которой есть три функции, которые должны вычислять...

Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main - C++
Здравствуйте! Помогите, пожалуйста! Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции...


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

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

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