указатели Vs ссылки
int f01(int* pa); или лучше int f01(int& ra);
Хотелось бы знать мнение опытного программиста, только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю :)
Насколько я понимаю, везде, где параметры в функции передаются через указатели, можно также использовать ссылки, и наоборот. Встает вопрос: более предпочтительнее объявлять функцию как
int f01(int* pa); или лучше int f01(int& ra);
Хотелось бы знать мнение опытного программиста, только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю :)
В Страуструпе есть мысль, что передавать через указатель указатель лучше, т.к. это позволяет увидеть, может менять функция значение или нет.
PS Всегда можно передать аргумент как const Type *, тогда при попытке его изменить на этапе компиляции дадут сообщения.
В Страуструпе есть мысль, что передавать через указатель указатель лучше, т.к. это позволяет увидеть, может менять функция значение или нет.
PS Всегда можно передать аргумент как const Type *, тогда при попытке его изменить на этапе компиляции дадут сообщения.
Это верно. Но тоже самое можно делать и с ссылками: int f01(const int& ra);
Слово "const" указывает компилятору, что данная переменная не может находиться слева от знака равенства :)
Ссылка улучшает читабельность программы, это несомненно. Например, функция
{
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++, я вообще не пользовался ссылками, но потом стал их употреблять всё чаще и чаще.
Я не могу придумать пример, в котором ссылка не могда бы быть заменена указателем...
Ссылка улучшает читабельность программы, это несомненно. Например, функция
{
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; //лучше ссылка
Если объект создается как указатель, то лучше указатель, а если нет, то лучше ссылка. Т.е.
int* num = new int[1]; //лучше указатель
int num; //лучше ссылка
А чем лучше-то?
А чем лучше-то?
А тем, что из контекста понятнее.
А чем лучше-то?
Основное отличие ссылки от указателя:
1. ссылка всегда должна быть инициализирована.
2. за все время своей жизни, ссылка ссылается на один и тот же объект.
т.е.
int &a; // непокатит
int &a = new int; //тоже неправильно
int b, c = 3;
int &a = b;
a = c; //b получает значение c, т.е. "а" не начал указывать на с.
Основное отличие ссылки от указателя:
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
за все время своей жизни, ссылка ссылается на один и тот же объект.
Неправда. Функция
{
int x = 2;
int& r = x; // r refers to x
int y = 3;
r = y; // r refers to y
}
компилируется без ошибок.
Неправда. Функция
{
int x = 2;
int& r = x; // r refers to x
int y = 3;
r = y; // r refers to y
}
компилируется без ошибок.
{
int x = 2;
int& r = x; // r ссылается на x
int y = 3;
r = y; // X стает равным 3
r = 8 // x стает равным 8, а y = 3
}
мда...ерунда какая-то(2й коммент).
{
int x = 2;
int& r = x; // r ссылается на x
int y = 3;
r = y; // X стает равным 3
r = 8 // x стает равным 8, а y = 3
}
Это очевидно. Здесь и доказывать нечего. Иначе различие между указателями и ссылками теряется и Кернигану нефига было огород городить.
Это очевидно. Здесь и доказывать нечего. Иначе различие между указателями и ссылками теряется и Кернигану нефига было огород городить.
Конечно. Ссылка это второе имя переменной, на которой она ссылается. Она даже не занимает доп.памяти
{
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, "");
}
но есть некоторые случай, в которых
обще принято(все так делают) использовать
ссылки.
От например если когда нидуь тебе
приходилось перегружать конструктор копировщик
в классе, т.е. переходить к глубинному
копированию, тогда обчно используют ссылки,
так повелось в народе.
Конечно. Ссылка это второе имя переменной, на которой она ссылается. Она даже не занимает доп.памяти
Я тоже знаю, что ссылка не занимает памяти. Поэтому хотелось бы понять, как реализуется передача параметров через ссылки? Этого пока понять не могу, может, кто знает?
Я тоже знаю, что ссылка не занимает памяти. Поэтому хотелось бы понять, как реализуется передача параметров через ссылки? Этого пока понять не могу, может, кто знает?
Передается адрес переменной, который разименовывается неявно.
т.е.
void f(int &a)
{
a = 3;
}
на самом деле компил. принимает за
void f(int *a)
{
*a = 3;
}
Передается адрес переменной, который разименовывается неявно.
т.е.
void f(int &a){a = 3;}
на самом деле компил. принимает за
void f(int *a){*a = 3;}
Значит, ссылки на самом деле теже указатели, только представленные в другом виде. Я правильно понял?
Значит, ссылки на самом деле теже указатели, только представленные в другом виде. Я правильно понял?
Я бы ответил, но в первом посту ты писал, что: "только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю"
Или хочешь сказать, что мы тебя запутали?
Я бы ответил, но в первом посту ты писал, что: "только вот не надо мне объяснять, что такое указатели и что такое ссылки. Я это все хорошо понимаю"
Или хочешь сказать, что мы тебя запутали?
Я понял, что я ошибался. Знаю, значит, не достаточно хорошо :(