Язык программирования C++ для профессионалов


Передача параметров


При вызове функции выделяется память для ее формальных параметров, и каждый формальный параметр инициализируется значением соответствующего фактического параметра. Семантика передачи параметров тождественна семантике инициализации. В частности, сверяются типы формального и соответствующего ему фактического параметра, и выполняются все стандартные и пользовательские преобразования типа. Существуют специальные правила передачи массивов. Есть возможность передать параметр, минуя контроль типа, и возможность задать стандартное значение параметра. Рассмотрим функцию:

void f(int val, int& ref) { val++; ref++; }

При вызове f() в выражении val++ увеличивается локальная копия первого фактического параметра, тогда как в ref++ - сам второй фактический параметр увеличивается сам. Поэтому в функции

void g() { int i = 1; int j = 1; f(i,j); }

увеличится значение j, но не i. Первый параметр i передается по значению, а второй параметр j передается по ссылке. Мы говорили, что функции, которые изменяют свой передаваемый по ссылке параметр, труднее понять, и что поэтому лучше их избегать. Но большие объекты, очевидно, гораздо эффективнее передавать по ссылке, чем по значению. Правда можно описать параметр со спецификацией const, чтобы гарантировать, что передача по ссылке используется только для эффективности, и вызываемая функция не может изменить значение объекта:

void f(const large& arg) { // значение "arg" нельзя изменить без явных // операций преобразования типа }

Если в описании параметра ссылки const не указано, то это рассматривается как намерение изменять передаваемый объект:

void g(large& arg); // считается, что в g() arg будет меняться

Отсюда мораль: используйте const всюду, где возможно.

Точно так же, описание параметра, являющегося указателем, со спецификацией const говорит о том, что указуемый объект не будет изменяться в вызываемой функции. Например:

extern int strlen(const char*); // из <string.h> extern char* strcpy(char* to, const char* from); extern int strcmp(const char*, const char*);




Начало  Назад  Вперед



Книжный магазин