Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

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

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

Нюансы синтаксиса и семантики: ссылки, указатели и массивы в качестве аргументов функций
Перенесено из этой темы. Чтобы вернуть указатели почему вот здесь не надо...

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

Константные указатели в качестве аргументов функций
Вскрылся вот такой пробел в знаниях/понимании. Итак, есть предположим...

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

Функции с указателями в качестве аргументов
Не могу понять почему происходит Segmentation fault при работе с указателями в...

55
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 10:30 #2
Цитата Сообщение от programina Посмотреть сообщение
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
0
gray_fox
What a waste!
1553 / 1258 / 166
Регистрация: 21.04.2012
Сообщений: 2,636
Завершенные тесты: 3
23.05.2013, 10:35 #3
Если надо просто передать объект в функцию, то однозначно лучше ссылка на константу. Если надо внутри функции изменить аргумент, то тут спорно; есть один подход - для таких вещей всегда использовать указатели, что бы при вызове надо было брать адрес объекта - и это как бы намекает на изменение объекта внутри функции.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:47  [ТС] #4
Цитата Сообщение от Jupiter Посмотреть сообщение
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.

Добавлено через 10 минут
Липманн пишет, что если параметр ссылается на разные обьеты или ни на что не ссылается, то надо использовать указатели.
Обьясните как ни на что не ссылаться - что это означает?
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 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
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:54  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
с ссылкой такие трюки не пройдут
то есть ссылка фактически привязанный к обьекту указатель?
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 11:00 #7
Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
можно сказать и так
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:05  [ТС] #8
Jupiter, спасибо
0
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,617
Записей в блоге: 1
23.05.2013, 11:06 #9
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти, где может располагаться объект (а может уже и не располагаться).
Посему (имхо) безопаснее использовать ссылку, т.к. если нет объекта, то нет и ссылки, указатель (переменная содержащая адрес) может содержать в себе адрес несуществующего объекта.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:12  [ТС] #10
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти.
Что значит "альтернативное имя" - это скопированный обьект или указатель на одну и тут же область памяти?
Не будет ли неэффективным использовать ссылки на массивные обьекты если окажется, что ссылка есть копия обьекта? Противоречие какое-то
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
23.05.2013, 11:22 #11
Лучший ответ Сообщение было отмечено как решение

Решение

Ссылка хранит адрес объекта, поэтому можешь рассматривать ее, как неизменяемый указатель.
Цитата Сообщение от programina Посмотреть сообщение
если окажется, что ссылка есть копия обьекта
Что значит "если окажется"? Если сомневаешься, то компилируй код и посмотри, какой ассемблерный код получился. Копии не будет. Ну, либо конструктор копирования напиши, сделай ссылку на объект и посмотри, вызовется ли конструктор копирования. Если бы это была копия, то ссылки были бы неэффективны.

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

Добавлено через 4 минуты
тема отправляется в закладки
0
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,617
Записей в блоге: 1
23.05.2013, 11:31 #13
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от programina Посмотреть сообщение
это скопированный обьект
скопированный объект, это уже отдельный объект
int a = 10; // a - имя объекта
int &b = a; // b - альтернативное имя объекта a, т.е. объект тот же самый, только в данном контексте называется b

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

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

Не по теме:

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

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

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

Лично мое мнение - указатели нужно использовать только внутри своих объектов и функций, а общение с "внешним миром" производить с помощью ссылок
2
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
23.05.2013, 14:29 #15
Vourhey,
C++
1
2
int *a=NULL;
    int &b = *a;
UB ж.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 08:10  [ТС] #16
а еще вот видела недавно такой пример:
C++
class cObj
{
public:
    int a;
    
    cObj operator + (cObj &);
};
 
cObj cObj::operator + (cObj & obj)
{
    cObj tmp; // это хорошо так делать?
    tmp.a = a + obj.a;
    return tmp;
}
 
int main()
{
    cObj x;
    cObj y;
 
    x.a = 4;
    y.a = 3;
 
    cout << (x + y).a << endl;
}
Добавлено через 12 минут
ред.

Добавлено через 12 минут
C++
// или лучше так:
cObj() {}
cObj(int a) { this->a = a; }
 
// ...
 
cObj cObj::operator + (cObj & obj)
{
    return cObj(this->a + obj.a);
}
0
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 09:36 #17
Цитата Сообщение от programina Посмотреть сообщение
// это хорошо так делать?
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
да один фиг, нормальный компилятор с включенными оптимизациями сгенерирует одинаковый код в обоих случаях
1
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,617
Записей в блоге: 1
24.05.2013, 09:41 #18
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
С указателем использование этого класса менее читабельным будет.
Ну и в перегрузке операторов приянто использовать константную ссылку.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 09:46  [ТС] #19
я просто боюсь, что локальное создание обьекта tmp может отразиться на быстродействии программы
0
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,617
Записей в блоге: 1
24.05.2013, 10:04 #20
Цитата Сообщение от programina Посмотреть сообщение
я просто боюсь, что локальное создание обьекта tmp может отразиться на быстродействии программы
А какой тогда смысл у operator+ в первом примере, если он не изменяет сам класс?
По логике вещей вот так надо переписать:
C++
1
2
3
4
5
cObj cObj::operator + (const cObj & obj)
{
    a += obj.a;
    return (*this);
}
1
24.05.2013, 10:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 10:04

Использование массивов в качестве аргументов функции
Написала программу, работает правильно, только не совсем по условию задачи....

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

Ostream и ofstream в качестве аргументов полиморфной функции
Здравствуйте! Перегрузил оператор &lt;&lt; с ostream и ofstream для пользовательского...


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

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

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