Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000101.doc
Скачиваний:
8
Добавлен:
30.04.2022
Размер:
370.18 Кб
Скачать

9.5. Модификаторы const и volatile

Const - запрещает изменение величины, которая инициализируется при описании.

Сonst float рi=3.14159 ;

В дальнейшем изменять значения рi нельзя. Переменные с модификатором const имеют ту же зону видимости, что и static.

Const очень похожа на #define, но в отличие от #define, обеспечивает контроль типов.

Volatile - переменная изменяется, причём величина может изменяться фоновым процессом, например, при обработке прерывания. Значение переменной должно браться не из регистра, а из оперативной памяти.

9.6. Доступ к глобальным переменным

Известно, что внутри блока действует локальная переменная, объявленная в нем. Чтобы иметь доступ к глобальной переменной с тем же именем, что и локальная, используется оператор разрешения области видимости :: (двойное двоеточие).

int i; . . .

int f() {

. . . int i;

. . . i++; // увеличение локальной i

::i++; // увеличение глобальной i

. . . }

Контрольные вопросы

  1. В чем отличие описания локальных переменных в Си и Си++?

  2. Для чего используется оператор :: ?

  3. Какие функции можно перегружать?

  4. С какой целью создаются перегруженные функции?

  5. Как используются модификаторы const и volatile?

  6. Зачем нужна перегрузка операторов?

  7. Какие операции можно перегружать?

  8. Чем удобна функциональная запись преобразования типов?

10. Объектно–ориентированное программирование

10.1. Инкапсуляция

Цель объектно-ориентированнного программирования (ООП) - максимально приблизить систему понятий, которой человек пользуется повседневно, общаясь на естественном языке, к языку программирования. Человек, говоря о каком–то объекте, подсознательно связывает с ним присущие ему свойства, связывает его с другими объектами. Например, подумав о доске, он подразумевает возможность писать на ней, подвешивать, передвигать, заменять другой. Этими свойствами обладает не только аудиторная доска, но и глиняная дощечка, доска объявлений и т.п., т.е. целый класс объектов.

ООП проектирует классы объектов. Программист сам создает эти классы и соответствующие им объекты. Он определяет связи между классами, взаимное состояние объектов, время их жизни. В ООП мышление программиста происходит в терминах объектов, наделенных определенными свойствами и поведением.

Программист должен определить, какой набор данных характеризует этот объект, как объект реагирует на какие–то запросы, как объект взаимодействует с другими объектами, с пользователем, какие запросы по ходу программы должны быть отправлены объекту.

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

Для определения класса применима запись:

класс = данные + функции работы с ними

Класс - это абстрактный тип данных, созданный специально программистом. Класс содержит члены–данные (data members) и члены-функции (member functions).

Слияние данных с функциями называется инкапсуляцией.

Синтаксис описания класса похож на синтаксис описания структур и объединений в стандартном языке Cи. Класс описывает некоторые объекты (object). Члены-данные объекта описывают его состояние (статику), члены-функции - поведение объекта (динамику).

Если обращение к функции–члену рассматривать как запрос объекту совершить некоторое действие, то набор функций–членов определяет набор запросов, на которые объекты данного класса будут откликаться соответствующим образом.

Для описания класса используются ключевые слова class, struct, union.

Например:

class A_Class {

рrivate:

int x; double y, z;

void f1(); int f2(int);

рublic:

char ch, ch1;

int f3(int, int); int GetX(); {return x;} }

Рrivate: и рublic: - это метки, которые определяют режим доступа к членам класса. Метки могут использоваться многократно, в любом порядке.

К рrivate: (закрытым) членам класса имеют доступ только члены класса и их друзья. Рublic: (открытые) члены класса доступны для программы, в которой объекты класса существуют. Они нужны для интерфейса объектов класса. По умолчанию режим доступа к членам класса - рrivate.

Если класс определен с помощью ключевыз слов struct или union, то по умолчанию члены класса являются открытыми (public). Для описанных с помощю struct классов члены класса можно явно делать закрытыми (рrivate), для union - только открытыми (рublic).

Определения функций–членов класса могут быть сделаны непосредственно при описании класса. Это имеет смысл при создании коротких функций, иначе описание класса становится “нечитаемым”.

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

Int MyClass::f(int i){. . . . .} // Функция f принадлежит классу MyClass.

Такую функцию можно сделать подставляемой с помощью inline:

inline Int MyClass::f(int i){. . . . .}

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

class C {

рublic:

. . . int f(int); . . . }

inline Int C::f(int i){. . . }

int main() {

C c_obj; . . . c_obj.f(); . . . }

Определение класса не создает объектов. Объекты создаются при описании переменных:

C ob1; MyClass ob2, ob[10];

Если программа состоит из нескольких модулей, то определение класса, используемого в этом модуле, должно присутствовать в нем.