Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на экзаменационные вопросы(все развернут....doc
Скачиваний:
6
Добавлен:
13.04.2019
Размер:
1.28 Mб
Скачать

Представление об области видимости переменных

При чтении книг и журнальных статей по C++ вы можете встретить термин область видимости, что определяет участок в программе, где имя переменной имеет смысл (и, следовательно, используется). Для локальной переменной область видимости ограничена функцией, внутри которой эта переменная объявлена. С другой стороны, глобальные переменные известны на протяжении всей программы. В результате глобальные переменные имеют большую область видимости.

  1. Параметры по значению и параметры по ссылке. Использование массивов в качестве параметров функции.

Способы передачи параметров в функцию:

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

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

  3. Передача по ссылке – передается адрес указанного при вызове параметра. Использование ссылок не требует копирования параметров.

Для запрета изменения параметра внутри функции, используется модификатор const.

Передача массивов в качестве параметров

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

Передача параметра возможна по значению и по ссылке. Иногда также используют выражение "передача параметра по адресу".

Передача параметра по значению

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

Передача параметра по адресу

Если необходимо именно изменить переменную из внешней, по отношению к вызываемой функции, области видимости, можно копировать адрес переменной, подлежащей изменению. Соответственно при вызове функции g(&x) приходится использовать операцию взятия адреса. Эта техническая деталь отвлекает внимание программиста от логики прикладной программы, однако в случаях невозможности передачи по ссылке может оказаться единственным решением.

Можно заметить, что передача параметра по адресу является частным случаем передачи по значению: передаваемым значением является адрес, по которому можно найти другое значение — значение переменной x.

Передача параметра по ссылке

Передача параметра по ссылке означает что копируется не само значение, а адрес исходной переменной (как в случае передачи параметра по адресу), однако синтаксис используется такой, чтобы программисту не приходилось использовать операцию разыменования и он мог иметь дело непосредственно со значением, хранящимся по этому адресу (как в случае передачи параметра по значению).

Передача по ссылке позволяет избежать копирования всей информации, описывающей состояние объекта (а это может быть существенно больше чем sizeof(int)) и является необходимой для конструктора копирования.

Если функция возвращает значение по ссылке (например в виде "return *this;"), то её вызов можно использовать слева от оператора присваивания (смотри также L-выражение).

В случае если передача по ссылке используется именно как средство увеличения быстродействия, но изменение параметра нежелательно, можно использовать передачу по ссылке константного объекта.

Таким образом можно ожидать, что примерная программа напечатает (если закоментировать ошибочную строку) "0010 022 233 333".

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