Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

указатели Vs ссылки

2.6K
19 февраля 2005 года
kupyxa
35 / / 20.10.2004
Насколько я понимаю, везде, где параметры в функции передаются через указатели, можно также использовать ссылки, и наоборот. Встает вопрос: более предпочтительнее объявлять функцию как
int f01(int* pa); или лучше int f01(int& ra);
Хотелось бы знать мнение опытного программиста, только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю :)
1.9K
20 февраля 2005 года
solovey
113 / / 25.07.2004
Цитата:
Originally posted by kupyxa
Насколько я понимаю, везде, где параметры в функции передаются через указатели, можно также использовать ссылки, и наоборот. Встает вопрос: более предпочтительнее объявлять функцию как
int f01(int* pa); или лучше int f01(int& ra);
Хотелось бы знать мнение опытного программиста, только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю :)


В Страуструпе есть мысль, что передавать через указатель указатель лучше, т.к. это позволяет увидеть, может менять функция значение или нет.
PS Всегда можно передать аргумент как const Type *, тогда при попытке его изменить на этапе компиляции дадут сообщения.

2.6K
20 февраля 2005 года
kupyxa
35 / / 20.10.2004
Цитата:
Originally posted by solovey

В Страуструпе есть мысль, что передавать через указатель указатель лучше, т.к. это позволяет увидеть, может менять функция значение или нет.
PS Всегда можно передать аргумент как const Type *, тогда при попытке его изменить на этапе компиляции дадут сообщения.



Это верно. Но тоже самое можно делать и с ссылками: int f01(const int& ra);
Слово "const" указывает компилятору, что данная переменная не может находиться слева от знака равенства :)

425
21 февраля 2005 года
sq_deep
498 / / 18.02.2005
Я не могу придумать пример, в котором ссылка не могда бы быть заменена указателем...

Ссылка улучшает читабельность программы, это несомненно. Например, функция
 
Код:
int& CSomeClass::i()
{
    return m_i;
}
...
    int m = sc.i();
...
    sc.i() = 12;

В случае указателя это выглядело бы
int m = *sc.i();
*sc.i() = 12;

В более сложных выражениях за дополнительными "*" потянутся скобки и т.д. Особенно это становится заметно, для шаблонов. И ещё больше, когда их разработчики не утруждают себя вколачиванием комментариев.

А Труп Страуса имел в виду не ссылки, а передачу параметров by value vs. by reference. Если у нас не используются ссылки, то синтаксис fun(i) ясно даёт понять, что i не изменится после вызова fun(), в то время как fun(&i) намекает на то, что i может и меняться. Это не только улучшает понимание, но и позволяет оптимизировать программу.

[COLOR=silver]Прошу прощения у г-на Страуструпа, если я интерпретировал его не так, как он предполагал...[/COLOR]

Когда я только переходил с C на C++, я вообще не пользовался ссылками, но потом стал их употреблять всё чаще и чаще.
259
21 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sq_deep
Я не могу придумать пример, в котором ссылка не могда бы быть заменена указателем...

Ссылка улучшает читабельность программы, это несомненно. Например, функция
 
Код:
int& CSomeClass::i()
{
    return m_i;
}
...
    int m = sc.i();
...
    sc.i() = 12;

В случае указателя это выглядело бы
int m = *sc.i();
*sc.i() = 12;

В более сложных выражениях за дополнительными "*" потянутся скобки и т.д. Особенно это становится заметно, для шаблонов. И ещё больше, когда их разработчики не утруждают себя вколачиванием комментариев.

А Труп Страуса имел в виду не ссылки, а передачу параметров by value vs. by reference. Если у нас не используются ссылки, то синтаксис fun(i) ясно даёт понять, что i не изменится после вызова fun(), в то время как fun(&i) намекает на то, что i может и меняться. Это не только улучшает понимание, но и позволяет оптимизировать программу.

[COLOR=silver]Прошу прощения у г-на Страуструпа, если я интерпретировал его не так, как он предполагал...[/COLOR]

Когда я только переходил с C на C++, я вообще не пользовался ссылками, но потом стал их употреблять всё чаще и чаще.


Если объект создается как указатель, то лучше указатель, а если нет, то лучше ссылка. Т.е.
int* num = new int[1]; //лучше указатель
int num; //лучше ссылка

425
21 февраля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by AlexandrVSmirno

Если объект создается как указатель, то лучше указатель, а если нет, то лучше ссылка. Т.е.
int* num = new int[1]; //лучше указатель
int num; //лучше ссылка


А чем лучше-то?

259
21 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by sq_deep

А чем лучше-то?


А тем, что из контекста понятнее.

368
21 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by sq_deep
А чем лучше-то?

Основное отличие ссылки от указателя:
1. ссылка всегда должна быть инициализирована.
2. за все время своей жизни, ссылка ссылается на один и тот же объект.

т.е.

int &a; // непокатит
int &a = new int; //тоже неправильно

int b, c = 3;
int &a = b;
a = c; //b получает значение c, т.е. "а" не начал указывать на с.

259
21 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by rostyslav
Основное отличие ссылки от указателя:
1. ссылка всегда должна быть инициализирована.
2. за все время своей жизни, ссылка ссылается на один и тот же объект.

т.е.

int &a; // непокатит
int &a = new int; //тоже неправильно

int b, c = 3;
int &a = b;
a = c; //b получает значение c, т.е. "а" не начал указывать на с.


В ту же тему http://forum.codenet.ru/showthread.php?s=&threadid=21631

425
21 февраля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by rostyslav
за все время своей жизни, ссылка ссылается на один и тот же объект.



Неправда. Функция

 
Код:
static void f()
{
    int x = 2;
    int& r = x;     // r refers to x
    int y = 3;
    r = y;          // r refers to y
}

компилируется без ошибок.
368
21 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by sq_deep


Неправда. Функция
 
Код:
static void f()
{
    int x = 2;
    int& r = x;     // r refers to x
    int y = 3;
    r = y;          // r refers to y
}

компилируется без ошибок.


 
Код:
static void f()
{
  int x = 2;
  int& r = x;  // r ссылается на x
  int y = 3;
  r = y;       // X стает равным 3
  r = 8        // x стает равным 8, а y = 3
}
259
21 февраля 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by rostyslav

мда...ерунда какая-то(2й коммент).
 
Код:
static void f()
{
  int x = 2;
  int& r = x;  // r ссылается на x
  int y = 3;
  r = y;       // X стает равным 3
  r = 8        // x стает равным 8, а y = 3
}


Это очевидно. Здесь и доказывать нечего. Иначе различие между указателями и ссылками теряется и Кернигану нефига было огород городить.

368
21 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by AlexandrVSmirno

Это очевидно. Здесь и доказывать нечего. Иначе различие между указателями и ссылками теряется и Кернигану нефига было огород городить.

Конечно. Ссылка это второе имя переменной, на которой она ссылается. Она даже не занимает доп.памяти

 
Код:
void f()
{
  int x = 2;
  int& r = x;       // r refers to x
  int y = 3;
  r = y;   
  r = 8;
  sprintf(c, "address x=%d, address y=%d, address r=%d", &x, &y, &r);
  MessageBox(c, "");
}
Адреса r и x равны.
279
22 февраля 2005 года
bave
456 / / 07.03.2004
Я сам всегда предпочитаю использовать указатели,
но есть некоторые случай, в которых
обще принято(все так делают) использовать
ссылки.
От например если когда нидуь тебе
приходилось перегружать конструктор копировщик
в классе, т.е. переходить к глубинному
копированию, тогда обчно используют ссылки,
так повелось в народе.
2.6K
22 февраля 2005 года
kupyxa
35 / / 20.10.2004
Цитата:
Originally posted by rostyslav
Конечно. Ссылка это второе имя переменной, на которой она ссылается. Она даже не занимает доп.памяти



Я тоже знаю, что ссылка не занимает памяти. Поэтому хотелось бы понять, как реализуется передача параметров через ссылки? Этого пока понять не могу, может, кто знает?

368
22 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by kupyxa
Я тоже знаю, что ссылка не занимает памяти. Поэтому хотелось бы понять, как реализуется передача параметров через ссылки? Этого пока понять не могу, может, кто знает?


Передается адрес переменной, который разименовывается неявно.

т.е.
void f(int &a)
{
a = 3;
}

на самом деле компил. принимает за

void f(int *a)
{
*a = 3;
}

2.6K
22 февраля 2005 года
kupyxa
35 / / 20.10.2004
Цитата:
Originally posted by rostyslav

Передается адрес переменной, который разименовывается неявно.
т.е.
void f(int &a){a = 3;}
на самом деле компил. принимает за
void f(int *a){*a = 3;}


Значит, ссылки на самом деле теже указатели, только представленные в другом виде. Я правильно понял?

368
23 февраля 2005 года
rostyslav
629 / / 13.07.2004
Цитата:
Originally posted by kupyxa
Значит, ссылки на самом деле теже указатели, только представленные в другом виде. Я правильно понял?

Я бы ответил, но в первом посту ты писал, что: "только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю"

Или хочешь сказать, что мы тебя запутали?

2.6K
23 февраля 2005 года
kupyxa
35 / / 20.10.2004
Цитата:
Originally posted by rostyslav
Я бы ответил, но в первом посту ты писал, что: "только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю"

Или хочешь сказать, что мы тебя запутали?



Я понял, что я ошибался. Знаю, значит, не достаточно хорошо :(

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог