Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in /home/studb20/public_html/index.php on line 4
 Константные аргументы функции - ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн - Studbook
Главная->Інформатика та програмування->Содержание->Константные аргументы функции

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн

Константные аргументы функции

Мы видели, что ссылочный механизм передачи аргументов в функцию позволя- ет функции изменять значения аргументов. Но существуют и другие причины для использования ссылок на аргументы функции, и одной из таких причин явля-

ется эффективность. Некоторые переменные, используемые в качестве аргумен- тов функции, могут иметь большой размер; примером являются структурные переменные с большим числом полей. В случае, если аргумент занимает много места в памяти, его передача по ссылке является гораздо более эффективной, поскольку в последнем случае в функцию передается не значение переменной, а только ее адрес.

Предположим, что вы используете ссылочный механизм только из соображе- ний эффективности и при этом не хотите, чтобы функция имела свободный доступ к аргументу и изменяла его значение. Для того чтобы получить подоб- ную гарантию, вы можете указать модификатор const перед соответствующим аргументом в прототипе функции. Пример CONSTARG демонстрирует применение этого метода.

// constarg.cpp

// демонстрирует константные аргументы функций

void aFunc( int& a, const int& b); // прототип функции

int main() {

int alpha = 7; int beta = 11; aFunc(alpha, beta);        //вызов функции return 0;

}

//--------------------------------------------------------

void aFunc(int& a, const int& b) // определение функции {

a = 107;                // корректно

b = 111;                // ошибка при попытке

// изменить константный аргумент

}

В данной программе мы хотим быть уверенными в том, что функция aFunc() не сможет изменить значения переменной beta (в то же время нам не нужно по- добной уверенности относительно переменной alpha). Мы используем модифи- катор const с переменной beta в прототипе функции и ее определении:

void aFunc(int& alpha, const int& beta);

Теперь любая попытка изменить содержимое переменной beta функцией aFunc() повлечет за собой сообщение об ошибке от компилятора. Одним из по- ложений идеологии разработчиков C++ является такое: лучше обнаруживать ошибки в программе на этапе ее компиляции, чем во время ее выполнения. Использование модификатора const демонстрирует этот принцип в действии.

Если вы желаете передать в функцию константную переменную с помощью ссылки, у вас не остается другого выбора, как использовать модификатор const в прототипе функции (с передачей константного аргумента по значению не возникает подобной проблемы; определение константной переменной гаран- тирует, что ни функция, ни любые операторы программы не способны изменить ее значения).

Многие библиотечные функции используют константные аргументы подоб- ным образом, как мы увидим в следующих наших примерах.

 

36