К списку форумов К списку вопросов
(Страйструп) передача аргументов функции по ссылке
AI
05.05.2004 - 14:53
вчера вечерком решившись отдохнуть - почитал наугад произвольную главу из книги. И вот что он в писал .
"Не рекомендуеться использовать в качестве аргументов функции ссылки"
f(int&a)
И аргументирует это тем что.
теряеться читабельность функции . вводит в панику прогеров. и должно использоваться только в крайних случаях когда функция явно об этом говорит из названия.
Теперь когда я переключаюсь на MFC :-) то повсеместно вижу такой подход как передача аргументов имеено как ссылки. Вот к примеру GetClientRect разве можно судит из названия что она берёт аргумент как ссылку.
Вопрос в чём.
Кто чё думает и как к этому всему относиться. :-)
ГыГы
1 - 05.05.2004 - 14:58
Как к скобкам :)
Наф
2 - 05.05.2004 - 14:59
На ночь книжки это клево
вопрос в чем: вот такая функция:
f(int &a)
{
 a++;
}
и такой код:
a=0;
b=f(a)+f(a);
вопрос чему равно b?
tvv
3 - 05.05.2004 - 15:11
предположу, что если включен оптимизатор, то явно не двум, а одному.
UE
4 - 05.05.2004 - 15:18
имхо, хреновый тогда этот оптимизатор :)
UE
5 - 05.05.2004 - 15:27
зря Страус-Труп так... ссылки есть рулез и биг пользА! А боялся если он паникующих программеров, то и не вводил бы в стандарт ссылки вообще ;)))
tvv
6 - 05.05.2004 - 15:32
Imho это только предположение, в Delphi c подобным сталкивался в С незнаю так как на нем пишу редко, но полагаю что так.
А оптимизатор не хреновый просто его предположения относительно кода не совпали с предположениями программиста...
UE
7 - 05.05.2004 - 15:43
Потому и хреновый, что не совпали :)))
asn
8 - 05.05.2004 - 16:00
Вообще этот код работать не должен, так как нужно еще и return писать.
наверное автор имел в виду
...
return a;
}
тогда результатом выражения будет 3;
tvv
9 - 05.05.2004 - 16:41
Дак этож ссылка зачем тут return
archimag
10 - 05.05.2004 - 16:51
MFC - это, мягко говоря, не шедевр, поэтому на неё равняться не стоит. А не рекомендуется использовать ссылки потому, что в месте вызова такой функции можно подумать (если не иметь перед глазами объявления), что параметр передаётся по значению и не может быть модифицирован, поэтому лучше использовать указатели. Общее правило: параметр не модифицируется - используем константные ссылки, иначе - указатели. А зачем ссылки ввели - "Дизайн и эволюция С++".
Сергей
11 - 05.05.2004 - 17:08
В стандарте С++ явно указывается, что результат указанного выше примера - когда вычисление операндов выражения вызывает побочные эффекты - не определен стандартом, т.е. полность зависит от реализации компилятора, настроек оптимизации и т.д. Здесь никак нельзя сказать, что ответ "1" чем-то лучше, чем "3" или наоборот. И так и так - плохо :)
Cool Ace
12 - 05.05.2004 - 19:29
Ну 3 не получится по любому, 1 ну или 2 если уж компилятор сильно выпендрится
AndreyCh
13 - 05.05.2004 - 22:29
#inсludе <iostream.h>
void f(int &a)
{
  a++;
}
void main()
{
  int a;
  a = 0;
  f(a);
  f(a);
  cout << a;
}
b - вообще левая переменная, если использовать ссылку в параметрах функции
но если ...
#inсludе <iostream.h>
int f(int &a)
{
  a++;
  return a;
}
void main()
{
  int a, b;
  a = 0; b = 0;
  b = f(a)+f(a);
        cout << b;
  
} то получается как раз 3 (BC++ v3.1)
наверно поэтому Страуструп не советует использовать ссылки в аргументах
LF
14 - 05.05.2004 - 23:03
2archimag: все верно, только c точностью наоборот :)
использовать ссылки Всегда, а указатели только когда это необходимо
archimag
15 - 05.05.2004 - 23:18
LF: в таком случае - обоснуй.
LF
16 - 05.05.2004 - 23:48
Использование ссылок и указателей - вопрос стиля. лишь бы не смешивались.
я исхожу из некоторых пунктов
УКАЗАТЕЛЬ
- если имееет место упавление жизнью объекта. всякие delete me; или me->Release()..
- если результат ф-ции может быть инвалидным, допустим ф-ция поиска элемента
CСЫЛКА
- объекты, которые живут дольше дубликанта
- всякие временные объякты, в пределах вычисления
- временные объекты
- нет избыточной проверки
- более безопастней
т.е. всегда стараемся юзать ссылку, кроме того где она не возможна.
это всего лишь мое имхо.
Сергей
17 - 05.05.2004 - 23:49
[14,15] Думаю, вы говорите о разном :)
В одном случае речь о передаче параметра по ссылке (что хорошо), в другом - о возвращении значения по ссылке (что уже не всегда хорошо).
archimag
18 - 06.05.2004 - 00:04
LF: как часто твой код читают другие люди? Если не читают - нет вопросов. Но если всё-таки читают, то желательно что бы код был достаточно выразительным и не вводил людей в заблуждение.
Пример:
f(a) - f модифицирует a или нет? читатель скорей всего подумает, что параметр передаётся по значению
f(&a) - сразу видно, что функция скорей всего модифицирует свой параметр.
LF
19 - 06.05.2004 - 08:04
f(a) вообще избыточное копирование, используется только когда НУЖНО это копирование.
ибо const
VaS
20 - 06.05.2004 - 18:38
В этом плане (18) С# таки хорош (ref)...

К списку вопросов на форуме Программирование

>>