Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

221 Глава 5

Вывод доказывает, что функция incrlO () непосредственно модифицирует пере- менную, переданную ей в аргументе.

Но если вы попытаетесь использовать числовое значение, такое как 20, в качестве аргумента incrlO (), то компилятор выдаст сообщение об ошибке. Дело в том, что компилятор обнаруживает, что параметр-ссылка может быть модифицирован внутри функции, но изменять значения констант нельзя. Это может внести в программы не- которое излишнее волнение, без которого имеет смысл обойтись.

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

Использование модификатора const

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

Структурная организация программ 222

Ниже показан вывод этой программы.

Описание полученных результатов

Вы объявляете переменную num в main () как const, чтобы показать, что когда параметр функции incrlO () объявлен как const, то компилятор более не выдает со- общений об ошибке при передаче константного объекта.

Необходимо также закомментировать оператор, который увеличивает значение num в функции incrlO (). Если вы уберете комментарий с этой строки, программа перестанет компилироваться, потому что компилятор не допустит появления num в левой части присваивания. Когда вы специфицируете num как const в заголовке и в прототипе функции, это значит, что вы обязуетесь не модифицировать его, и компи- лятор проверяет, как вы держите слово.

Все работает как прежде, за исключением того, что переменные из main () более не изменяются в функции.

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

Аргументы main ()

Функцию main () можно объявлять без аргументов (или лучше со списком пара- метров void), либо же специфицировать список параметров, которые позволяют этой функции получать аргументы из командной строки. Значения, передаваемые в качестве аргументов main (), всегда интерпретируются как строки. Если вы хотите в main () получить данные из командной строки, то должны определить ее следующим образом:

Первый параметр — счетчик строк, переданных программе в командной строке, включая имя самой программы, а второй параметр — массив указателей на эти строки плюс один дополнительный нулевой указатель. Таким образом, значение argc всегда не меньше 1, поскольку при запуске программы всегда, как минимум, указывается ее имя. Количество полученных аргументов зависит от того, что вы вводите в команд- ной строке для запуска программы. Например, предположим, что вы выполняете программу DoThat с помощью следующей команды:

DoThat.exe