Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР13-С++17-мая-2012.doc
Скачиваний:
13
Добавлен:
15.09.2019
Размер:
1.3 Mб
Скачать

1.9. Принцип сокрытия данных внутри функции. Принцип локализации имен

Этот термин имеет много синонимов, например, пространство имен, приоритет имен, принцип сокрытия имен. Применяется в случае, когда локальное имя какого-нибудь объекта в теле функции совпадает с именем глобального объекта. Что касается выбора имен, то имя любого объекта в любом блоке уникально, но в разных блоках имена могут повторяться, неся различную смысловую нагрузку. Особенно это касается имен рабочих переменных.

Пример 13.22

int A = 90;

void F(int x)

{

int A = 0; // каким же будет значение А в теле функции?

}

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

Пример 13.23

Чтобы увидеть механизмы локализации данных и принцип локализации имен, этот пример следует выполнять в отладчике.

#include <stdio.h>

#include <conio.h>

// глобальные данные программы

int a;

int n = 1;

void f1 (void); // объявление функций глобально

void f2 (void);

void f3 (int);

void main(void)

{

int i; // локальная переменная функции main

a = 10; // функция main изменяет глобальную переменную

// все функции имеют одинаковые права на изменение глобального данного

for (i = 1; i <= 3; i++)

{

n ++; // main изменяет значение n, нумеруя последовательность

// вызовов функции f1

printf ("\nMain. Вход № %d", n);

f1 (); // f1 тоже меняет значение n, потому что

} // main и f1имеют одинаковые права на изменение n

for (i = 1; i <= 3; i++)

{

a ++; // main изменяет значение a

printf ("\nMain. Глобальная а: %d", a);

f2(); // в функции f2 значение а свое собственное

}

// как передача данного в функцию защищает его от изменения

f3 (a);

printf ("\nЗначение глобального а после обращения к f3 %d", a);

}

// f1 печатает номер обращения

void f1 ()

{

n ++; // функция меняет глобальную переменную n

printf ("\nФункция f1. Вход %d", n);

}

// f2 печатает значение локальной переменной

void f2 ()

{

int a = 90; // а — локальное данное функции f2

printf "\nФункция f2. Локальная а %d", a);

}

// f2 печатает значение локальной переменной

void f3 (int a) // глобальная переменная передается

{ // как параметр, защищена от изменения

a ++; // локальное данное функции f3

printf("\nФункция f3. Не меняет значение глобального а %d", a);

}

1.10. Передача одномерных массивов как параметров функции

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

Пример 13.24

void print(int a[100],int n) //вывод массива на печать

{

for(int i=0;i<n;i++)

cout<<a[i]<<" ";

cout<<"\n";

}

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