- •Классы и заголовочные файлы Отделение объявления от реализации
- •Int m_month;
- •Int m_year;
- •Int getValue () { return m_value ; }
- •Int getValue () {return m_value;}
- •Классы и заголовочные файлы
- •Int getDay () {return m_day;}
- •Void Date::SetDate (int day, int month, int year) {
- •Параметры по умолчанию
- •Библиотеки
- •Заключение
- •Классы и const
- •Константные объекты классов
- •Int m_value;
- •Int getValue () { return m_value ; }
- •Int main () {
- •Константные методы классов
- •Int m_value;
- •Int m_value;
- •Int m_value;
- •Константные ссылки и классы
- •Int getDay () {return m_day;}
- •Void printDate (const Date &date) {
- •Int main () {
- •Int m_month;
- •Int m_year;
- •Void setDate (int day, int month, int year) {
- •Перегрузка константных и неконстантных функций
- •Int main () {
- •Статические переменные-члены класса
- •Статические переменные-члены класса
- •Int generateId () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Статические члены не связаны с объектами класса
- •Int main () {
- •Определение и инициализация статических переменных-членов класса
- •Инициализация статических переменных-членов внутри тела класса
- •Использование статических переменных-членов класса
- •Int getId() const { return m_id; }
- •Int main () {
- •Статические методы класса
- •Int main () {
- •Int main () {
- •Статические методы не имеют указателя this
- •Int main () {
- •Предупреждение о классах со всеми статическими членами
- •Int main () {
- •Дружественные функции и классы
- •Int m_value;
- •Void reset (Anything &anything) {
- •Int main () {
- •Int m_value;
- •Дружественные функции и несколько классов
- •Дружественные классы
- •Примечания о дружественных классах:
- •Дружественные методы
- •If (m_displayIntFirst)
- •Int m_intValue;
- •Values (int intValue, double dValue) {
- •Анонимные объекты
- •Int main () {
- •Анонимные объекты класса
- •Int m_dollars;
- •Int getDollars () const {return m_dollars;}
- •Int main () {
- •Int m_dollars;
- •Int getDollars() const { return m_dollars; }
- •Int main () {
- •Вложенные типы данных в классах
- •Int main () {
- •Вложенные пользовательские типы данных в классах
- •Int main () {
- •Другие вложенные пользовательские типы данных в классах
Классы и заголовочные файлы Отделение объявления от реализации
Все классы, которые мы использовали до сих пор, были достаточно простыми, поэтому мы записывали методы непосредственно внутри тела классов, например:
class Date {
private:
int m_day;
int m_month;
int m_year;
public:
Date (int day, int month, int year) {
setDate (day, month, year);
}
void setDate(int day, int month, int year) {
m_day = day;
m_month = month;
m_year = year;
}
int getDay() { return m_day; }
int getMonth() { return m_month; }
int getYear() { return m_year; }
};
Однако, как только классы становятся больше и сложнее, наличие всех методов внутри тела класса может затруднить его управление и работу с ним.
Использование уже написанного класса требует понимания только его открытого интерфейса, а не того, как он реализован.
К счастью, язык C++ предоставляет способ отделить «объявление» от «реализации».
Это делается путем определения методов вне тела самого класса. Для этого просто определите методы класса, как если бы они были обычными функциями, но в качестве префикса добавьте к имени функции имя класса с оператором разрешения области видимости (::).
Вот наш класс Date с конструктором Date () и методом setDate (), определенными вне тела класса.
Обратите внимание, прототипы этих функций все еще находятся внутри тела класса, но их фактическая реализация находится за его пределами:
class Date {
private:
int m_day;
Int m_month;
Int m_year;
public:
Date (int day, int month, int year);
void SetDate (int day, int month, int year);
int getDay () { return m_day; }
int getMonth () {return m_month;}
int getYear () {return m_year;}
};
// Конструктор класса Date
Date::Date (int day, int month, int year) {
SetDate (day, month, year);
}
// Метод класса Date
void Date::SetDate(int day, int month, int year){
m_day = day;
m_month = month;
m_year = year;
}
Просто. Поскольку во многих случаях функции доступа могут состоять всего из одной строки кода, то их обычно оставляют в теле класса, хотя переместить их за пределы класса можно всегда.
Вот еще один пример класса с конструктором, определенным извне, со списком инициализации членов:
class Mathem {
private:
int m_value = 0;
public:
Mathem (int value=0): m_value(value) {}
Mathem& add (int value) { m_value += value; return *this; }
Mathem& sub (int value) { m_value -= value; return *this; }
Mathem& divide (int value) { m_value /= value; return *this; }
Int getValue () { return m_value ; }
};
Конвертируем в:
class Mathem {
private:
int m_value = 0;
public:
Mathem (int value=0);
Mathem& add (int value);
Mathem& sub (int value);
Mathem& divide (int value);
Int getValue () {return m_value;}
};
Mathem::Mathem (int value): m_value(value) {
}
Mathem& Mathem::add (int value) {
m_value += value;
return *this;
}
Mathem& Mathem::sub (int value) {
m_value -= value;
return *this;
}
Mathem& Mathem::divide (int value) {
m_value /= value;
return *this;
}
