Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЯП_Си++_Слайды_02_2013

.pdf
Скачиваний:
17
Добавлен:
12.02.2015
Размер:
239.51 Кб
Скачать

//имя класса - с большой буквы (рекомендация)

//имена полей и методов – с маленькой буквы (рекомендация) class Time{

private: //скрытые поля и методы int hour; //час

int minute; //минута int second; //секунда

public: //интерфейс класса

Time();

//конструктор: имя совпадает с именем класса

int getHour(){return hour;}

int getMinute(){return minute;} int getSecond(){return second;}

void setTime(int, int, int); //установить час, минуту, секунду;

void printTime();

};

1

-Инициализация полей при описании не допускается.

-Все методы класса имеют непосредственный доступ к его скрытым элементам.

-Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы.

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

Time::Time(){

hour = minute = second = 0;

}

void Time::setTime(int h, int m, int s){ hour = h; minute = m; second = s;

}

void Time::printTime(){ printf("%2.2i:%2.2i:%2.2i\n",hour,minute,second);

}

2

1.2. Описание объектов

Объект (экземпляр класса) - конкретная переменная типа «класс».

Time t;

//объект класса Time, автоматически вызывается конструктор

Time tt[10];

//массив объектов класса Time Time *pt = new Time();

//динамический объект, конструктор вызывается явно

-Выделение памяти и автоматический вызов конструктора.

-Методы класса?

-Освобождение памяти и автоматический вызов деструктора.

sizeof(Time) == sizeof(t) == 12

//размер всех полей класса (или объекта)

3

Доступ к элементам объекта

t.setTime(1,1,1); t.printTime();

pt->setTime(10,10,10); pt->printTime();

1.3. Отделение интерфейса от реализации

//---------------

time.h---------------

//объявление класса Time

//предотвращение многократного включения заголовочного файла #ifndef TIME_H //имя символической константы повторяет имя

//заголовочного файла

#define TIME_H class Time{

//…

};

#endif

4

//---------------time.cpp---------------

//определение методов класса Time (Time::имя_метода) #include "time.h"

#include<stdio.h> //…

//---------------

main.cpp---------------

#include "time.h"

 

int main(){

 

//…

 

}

 

5

1.4.Константные поля, методы, объекты (const)

1.Константное поле

const int const_d;//константное поле

2. Константный метод

int getHour() const {return hour;} //константный метод

3. Константный объект

const

Time t;

//константный

объект

int i

= t.getHour(); //константный

метод

6

1.5. Указатель this

1.Объект – поля?

2.Объект – методы?

Вопрос: Как метод выбирает, с полями какого объекта работать?

Ответ: this

Неявное использование:

Time::Time(){ hour = 0;

//можно так: this->hour = 0; //или так: (*this).hour = 0;

}

7

Явное использование:

//---------------

time.h---------------

class Time{ …

public:

Time& later(Time&);

};

time.cpp

//---------------

Time& Time::later(Time& t){

//возвращает ссылку на объект, в котором hour больше

 

if (hour > t.getHour()) return *this;

}

else return t;

main.cpp

//

int main(){

Time t, t1; //объекты класса Time t.setTime(1,1,1); t1.setTime(10,10,10); t.later(t1).printTime();//...

}

ВЕРНЕМСЯ, КОГДА НАПИШЕМ КОНСТРУКТОР КОПИРОВАНИЯ!!!

8

1.6. Конструкторы

Предназначение.

Вызов: неявный (автоматический) и явный.

Имя.

Основные свойства конструкторов

1.Возвращаемое значение.

2.Число конструкторов.

3.Конструктор по умолчанию.

4.Значения параметров по умолчанию.

5.Наследование.

6.Нельзя const, virtual и static.

7.Когда вызывается.

9

//---------------time.h---------------

class Time{

public:

Time(int = 0, int = 0, int = 0); //конструктор КАКОЙ? Time(char *); //конструктор КАКОЙ?

};

Конструктор преобразования

void f(const Time& t){

}

f("20"); //возможен ли такой вызов функции f?

explicit Time(char *);

10