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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:23     Указатели или ссылки (в качестве аргументов функции) ? #1
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
В общем поняла, что и те и другие полезны для ссылания на крупные обьекты типа классов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 10:23     Указатели или ссылки (в качестве аргументов функции) ?
Посмотрите здесь:

C++ функции,указатели и ссылки.
Указатели на массивы в качестве аргументов C++
C++ Написать программу с использованием функции, которая сравнивает две строки, заданные в качестве её аргументов
Ссылки или указатели (Написать функцию , которая вычисляет гипотенузу, площадь и периметр прямоугольного треугольника) C++
Идентификаторы списка в качестве аргументов функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 10:30     Указатели или ссылки (в качестве аргументов функции) ? #2
Цитата Сообщение от programina Посмотреть сообщение
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
23.05.2013, 10:35     Указатели или ссылки (в качестве аргументов функции) ? #3
Если надо просто передать объект в функцию, то однозначно лучше ссылка на константу. Если надо внутри функции изменить аргумент, то тут спорно; есть один подход - для таких вещей всегда использовать указатели, что бы при вызове надо было брать адрес объекта - и это как бы намекает на изменение объекта внутри функции.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:47  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #4
Цитата Сообщение от Jupiter Посмотреть сообщение
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.

Добавлено через 10 минут
Липманн пишет, что если параметр ссылается на разные обьеты или ни на что не ссылается, то надо использовать указатели.
Обьясните как ни на что не ссылаться - что это означает?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 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
с ссылкой такие трюки не пройдут
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:54  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #6
Цитата Сообщение от Jupiter Посмотреть сообщение
с ссылкой такие трюки не пройдут
то есть ссылка фактически привязанный к обьекту указатель?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 11:00     Указатели или ссылки (в качестве аргументов функции) ? #7
Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
можно сказать и так
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:05  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #8
Jupiter, спасибо
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
23.05.2013, 11:06     Указатели или ссылки (в качестве аргументов функции) ? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от programina Посмотреть сообщение
то есть ссылка фактически привязанный к обьекту указатель?
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти, где может располагаться объект (а может уже и не располагаться).
Посему (имхо) безопаснее использовать ссылку, т.к. если нет объекта, то нет и ссылки, указатель (переменная содержащая адрес) может содержать в себе адрес несуществующего объекта.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:12  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #10
Цитата Сообщение от oxotnik Посмотреть сообщение
Ссылка это "альтернативное имя объекта". Указатель - переменная, содержащая адрес памяти.
Что значит "альтернативное имя" - это скопированный обьект или указатель на одну и тут же область памяти?
Не будет ли неэффективным использовать ссылки на массивные обьекты если окажется, что ссылка есть копия обьекта? Противоречие какое-то
Vourhey
Почетный модератор
6469 / 2244 / 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
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 11:26  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #12
oxotnik, Vourhey, спасибо.

Добавлено через 4 минуты
тема отправляется в закладки
oxotnik
 Аватар для oxotnik
1584 / 1061 / 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 Посмотреть сообщение
Хотя, и глупостью можно заняться тоже
Дай дураку стеклянный х..., он и его разобъет, и руки порежет.

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
23.05.2013, 12:34     Указатели или ссылки (в качестве аргументов функции) ? #14
Цитата Сообщение от programina Посмотреть сообщение
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.
не в этом случае.

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

Лично мое мнение - указатели нужно использовать только внутри своих объектов и функций, а общение с "внешним миром" производить с помощью ссылок
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.05.2013, 14:29     Указатели или ссылки (в качестве аргументов функции) ? #15
Vourhey,
C++
1
2
int *a=NULL;
    int &b = *a;
UB ж.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 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);
}
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 09:36     Указатели или ссылки (в качестве аргументов функции) ? #17
Цитата Сообщение от programina Посмотреть сообщение
// это хорошо так делать?
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
да один фиг, нормальный компилятор с включенными оптимизациями сгенерирует одинаковый код в обоих случаях
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
24.05.2013, 09:41     Указатели или ссылки (в качестве аргументов функции) ? #18
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
С указателем использование этого класса менее читабельным будет.
Ну и в перегрузке операторов приянто использовать константную ссылку.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
24.05.2013, 09:46  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #19
я просто боюсь, что локальное создание обьекта tmp может отразиться на быстродействии программы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 10:04     Указатели или ссылки (в качестве аргументов функции) ?
Еще ссылки по теме:

C++ Константные указатели в качестве аргументов функций
C++ Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main
Ostream и ofstream в качестве аргументов полиморфной функции C++

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

Или воспользуйтесь поиском по форуму:
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 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);
}
Yandex
Объявления
24.05.2013, 10:04     Указатели или ссылки (в качестве аргументов функции) ?
Ответ Создать тему
Опции темы

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