ЯП_Си++_Слайды_02_2013
.pdf//имя класса - с большой буквы (рекомендация)
//имена полей и методов – с маленькой буквы (рекомендация) 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