![]() |
![]() |
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)... |