Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_С++_последная.doc
Скачиваний:
40
Добавлен:
07.05.2019
Размер:
876.54 Кб
Скачать

7.4.2. Использование класса

Имея определение класса, можно объявлять переменные типа «имя_класса». Переменная класса называется объектом, или экземпляром класса. Класс объявляется один раз, а вот объектов можно создать столько, сколько необходимо. Объекты объявляются аналогично переменным встроенного типа:

имя_класса имя_объекта; // скалярный объект

имя_класса *имя_объекта; // указатель

имя_класса имя_объекта [количество]; // массив

При объявлении переменных можно задавать ключевые слова class и struct:

class имя_класса имя_объекта; // скалярный объект

class имя_класса *имя_объекта; // указатель

struct имя_класса имя_объекта [количество]: // массив

Разрешается совмещать определение класса и объявление переменной:

class имя_класса { члены_класса } имя_объекта; // объект

class имя_класса { члены_класса } *имя_объекта; // указатель

struct имя_класса { члены_класса }

имя_объекта [ количество]; // массив

Эти переменные получают тип «имя_класса». Тогда в дальнейшем можно объявлять переменные без записи определения класса и без служебных слов class или struct, как показано выше. Объявленные переменные подчиняются правилам видимости, как и переменные встроенных типов, и время их жизни зависит от места объявления.

Следующие переменные могут быть объявлены для приведенных в листинге классов:

NullType a. *pb; // скалярная переменная и указатель

Empty d[10]; // массив

date *pd: // указатель

class Money t: // скалярная переменная

class Money *p; // указатель

class Money m[100]; // массив

XXX YYY; // скалярная переменная

Library L[10]. *pl : // массив и указатель

class Class { /*... */ } // определение класса

vl. v2[20]; // скалярная переменная и массив

Переменным vl и v2 присваивается тип Class, после чего для объявления других переменных достаточно указания типа Class, например

Class v3. v4[10]:

Переменную можно инициализировать другой переменной того же класса. Разрешается объявлять и ссылки на объекты с обязательной инициализацией.

Money х = t; // инициализация переменной

date y(d); // инициализация переменной

date &u = у; // обязательная инициализация ссылки

Если поля открыты, разрешается обычная инициализация полей инициализатором структуры, например

class Person

{public: string Fio; double Summa;};

Person Kupaev - {"Купаев М.", 10000.00};

Указатели могут быть инициализированы так же, как и указатели на переменные встроенных типов:

Money *pt = new Money,*pp =pt,*ps; // объявление указателей

ps = new TMoney; // и создание объектов

date *pd = new date(), *pr; // объявление указателей

pr = new date(); // и создание объектов

Форма со скобками после типа выполняет обнуление полей динамического объекта.

Объекты класса разрешается определять в качестве полей другого класса:

class Count

{Money Summa; // сумма на счете

unsigned long NumberCount; // номер счета

date D; // дата открытия счета

public:

void Display(); // вывод на экран

};

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

Объекты класса можно передавать в качестве аргументов любыми способами (по значению, по ссылке, по указателю) и получать как результат из функции:

Money AddMoneyCconst Money &a, const Money &b); // по константной ссылке

Money Init(const long double &r); // возврат значения

void fKdate t); // по значению

void f2(date &t); //по ссылке

void f3(date *t); // по указателю

Функция, возвращающая объект класса, может быть использована для инициализации переменной класса:

Money t = Init(200.56); Money r = AddMoney(x.y);

Можно объявлять объекты-константы класса с обязательной инициализацией:

const Money k – р;

const date d(t);

const Money t = Init(200.50);

Доступ к открытым полям выполняется обычными для структуры способами:

объект.поле указатель->поле;

Вызов открытых методов осуществляется аналогично:

объект.метод(параметры);

указатель->метод (параметры);

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

#include <string>

Для показанного выше класса time самая скромная реализация может выглядеть следующим образом:

std::string time::toString()

{std::string s = ""; // строка-результат

Std::string Digits = "0123456789": // цифры для результата

unsigned char dl,d2; // выделенная цифра

// формируем часы в строку

dl = hours/10; d2 = hours%10; // получаем цифры часов

s=s+Digits[dl]; // прицепляем старшую цифру

s=s+Digits[d2]; // прицепляем младшую цифру

s+="."; // завершение подстроки

// формируем минуты в строку

dl = minutes/10; d2 = minutesu%10; // вычисляем цифры минут

s=s+Digits[dl]; s=s+Digits[d2];

// формируем секунды в строку

dl = seconds/10; d2 = seconds%10; // получаем цифры секунд

s=s+Digits[dl]; =s+Digits[d2];

return s;

}

Метод возвращает текущее значение полей класса time в виде строки «чч.мм.сс».