Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекция 3-4n.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
74.69 Кб
Скачать

Классы и заголовочные файлы Отделение объявления от реализации

Все классы, которые мы использовали до сих пор, были достаточно простыми, поэтому мы записывали методы непосредственно внутри тела классов, например:

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;

}