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

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

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

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

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

В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
В общем поняла, что и те и другие полезны для ссылания на крупные обьекты типа классов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2013, 10:23     Указатели или ссылки (в качестве аргументов функции) ?
Посмотрите здесь:
Нюансы синтаксиса и семантики: ссылки, указатели и массивы в качестве аргументов функций C++
Указатели на массивы в качестве аргументов C++
C++ Константные указатели в качестве аргументов функций
C++ С++ Тема «Указатели и динамические массивы. Использование указателей в качестве аргументов функций»
Идентификаторы списка в качестве аргументов функции C++
C++ Использование массивов в качестве аргументов функции
Ostream и ofstream в качестве аргументов полиморфной функции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.05.2013, 10:30     Указатели или ссылки (в качестве аргументов функции) ? #2
Цитата Сообщение от programina Посмотреть сообщение
В каких случая надо использовать ссылки и в каких указатели в качестве аргументов функции?
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
23.05.2013, 10:35     Указатели или ссылки (в качестве аргументов функции) ? #3
Если надо просто передать объект в функцию, то однозначно лучше ссылка на константу. Если надо внутри функции изменить аргумент, то тут спорно; есть один подход - для таких вещей всегда использовать указатели, что бы при вызове надо было брать адрес объекта - и это как бы намекает на изменение объекта внутри функции.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
23.05.2013, 10:47  [ТС]     Указатели или ссылки (в качестве аргументов функции) ? #4
Цитата Сообщение от Jupiter Посмотреть сообщение
это холиварный вопрос и ответа на него ты не получишь, у каждого своя правда, опыт и колокольня.
достоинства ссылок и указателей уже обсуждали и не раз, ищи.
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.

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

Добавлено через 4 минуты
тема отправляется в закладки
oxotnik
1586 / 1063 / 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
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
23.05.2013, 12:34     Указатели или ссылки (в качестве аргументов функции) ? #14
Цитата Сообщение от programina Посмотреть сообщение
Это хорошо, что холиварный, больше мнений. Истина рождается в споре.
не в этом случае.

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

Лично мое мнение - указатели нужно использовать только внутри своих объектов и функций, а общение с "внешним миром" производить с помощью ссылок
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
23.05.2013, 14:29     Указатели или ссылки (в качестве аргументов функции) ? #15
Vourhey,
C++
1
2
int *a=NULL;
    int &b = *a;
UB ж.
programina
1914 / 599 / 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
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.05.2013, 09:36     Указатели или ссылки (в качестве аргументов функции) ? #17
Цитата Сообщение от programina Посмотреть сообщение
// это хорошо так делать?
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
да один фиг, нормальный компилятор с включенными оптимизациями сгенерирует одинаковый код в обоих случаях
oxotnik
1586 / 1063 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
24.05.2013, 09:41     Указатели или ссылки (в качестве аргументов функции) ? #18
Цитата Сообщение от programina Посмотреть сообщение
// или лучше так:
С указателем использование этого класса менее читабельным будет.
Ну и в перегрузке операторов приянто использовать константную ссылку.
programina
1914 / 599 / 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++ функции,указатели и ссылки.
C++ Дан файл, переписать его в обратном направлении, передавая имена файлов в качестве аргументов функции main
Ссылки или указатели (Написать функцию , которая вычисляет гипотенузу, площадь и периметр прямоугольного треугольника) C++
Правильно ли я понимаю ссылки и указатели. Работу с ними. Я сам прокомментировал код. Скажите правильно или нет. C++

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

Или воспользуйтесь поиском по форуму:
oxotnik
1586 / 1063 / 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     Указатели или ссылки (в качестве аргументов функции) ?
Ответ Создать тему
Опции темы

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