Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа ЯПВУ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.4 Mб
Скачать

Система типов

С++ – строго типизированный язык, то есть любая величина, с которой оперирует программа, относится к определенному типу. Тип величины задается в момент ее создания и не может быть изменен во время выполнения программы.

Встроенные типы – это целые со знаком и без знака и вещественные числа различной точности, булевские значения и символы. Программист может определять новые типы с помощью оператора typedef:

typedef char SimpleString[100]; // Обявление новых типов

typedef int Length;

SimpleString name, title; // Создание переменных новых типов

Length width, height;

Также, как и в С можжно использовать перечислимые типы (enum) и составные типы (структуры – с помощью ключевого слова struct).

Классы – это типы, которые определены пользователем. Общая структура класса выглядит следующим образом:

class ИмяКласса {

public:

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

protected:

// область защищенных переменных и методов

private:

// область закрытых переменных и методов

};

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

В отличие от структур Си, структуры C++ фактически являются типами определяемыми пользователем, без использования ключевого слова typedef. Класс, имеющий все элементы типа public без каких-либо функций, является обычной структурой Си.

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

Инкапсуляция в С++ обеспечивается наличием областей видимости членов класса:

  • открытые (общедоступные, public) – к которым могут обращаться любые внешние объекты. Эта область определяет внешний интерфейс класса;

  • защищенные (protected) – доступные только методам данного класса и потомков данного класса (то есть порожденным от него с помощью наследования);

  • закрытые (приватные, private) – доступным только для методов своего класса.

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

Пример класса

Ниже приведен пример описания класса Банковского счета:

01: class Account // БанковскийСчет

02: {

03: public:

04: Account(int number) : // конструктор

05: accountNumber(number), amount(0)

06: {}

07: ~Account() {} // деструктор

08: void deposit(float sum); // положить на счет

09: void withdraw(float sum); // снять со счета

10: float balance() { // проверить баланс

11: return amount;

12: }

13: protected:

14: float amount; // сумма на счете

15: private:

16: long accountNumber; // номер счета

17: };

18: void Account::deposit(float sum) {

19: amount += sum;

20: }

21: void Account::withdraw(float sum) {

22: amount -= sum;

23: }

24: void main() {

25: Account a(12345L);

26: a.deposit(1000);

27: a.withdraw(300);

28: cout << a.balance();

29: }

Имя класса задается в строке 1, в открытой области видимости задаются конструктор и деструктор класса. Эти методы вызываются при создании и уничтожении экземпляров класса.

Конструктор определяет, каким образом новый объект типа класса будет создан, как будет проводиться выделение памяти и инициализация объекта. Его определение может включать инструкции для выделения памяти, присваивания значений элементам, преобразование типов, и все что угодно, необходимое для данного класса. Конструктор имеет то же имя, что и класс (строка 4). При вызове конструктора при помощи операции ':' после заголовка функции, и перед телом функции можно вызвать конструктор базового класса (родителя) или инициализировать собственные переменные (строка 5). В данном примере тело конструктора (строка 6) не содержит никаких операторов или вызовов функций.

Деструкторы уничтожают объекты класса, созданные перед этим конструктором, очищая значения и освобождая память. Деструкторы наследуют имена своих классов, с добавлением лидирующего знака тильда '~' (строка 7).

В строках 8 и 9 объявлены два метода класса не возвращающих значение (void) и принимающих один параметр. В строках 10-12 объявляется функция balance и, также, и определяется, так как там же задано и тело функции (внутреннее или inline определение).

Далее в строках 13-16 задаются два атрибута, один из которых является приватным. В строках 18-20 задается тело функции для метода deposit (аналогично в строках 21-23 – для withdraw). Обратите внимание на использование операции селектор области действия '::' между определяемым классом и функцией элементом. Имя класса Account используется для указания компилятору, к какому классу принадлежит withdraw (так как могут иметься и другие варианты withdraw, принадлежащие другим классам).

Далее в функции main создается переменная a типа Account с параметром, который передается функции-конструктору (строка 25) и вызываются методы класса deposit и withdraw (для вызова метода используется точка '.') – строки 26 и 27. В строке 28 баланс счета выводится на экран с использованием потока вывода cout (для работы с потоками необходимо подключить заголовочный файл iostream.h).