Lect02
.pdfРеализацияметодовза
пределамиописаниякласса
class имя_класса {
// Описания, секции и т.п.
тип имя_метода(параметры метода);
};
тип имя_класса::имя_метода(параметры метода)
{
// тело метода
}
P.S. Такой способ разделения описания и реализации совпадает с использованием прототипов функций в
C/C++, но в отличие от прототипов, меняет
поведение компилятора при обработке метода!
Реализацияметодовза
пределамиописаниякласса
class имя_класса {
// Описания, секции и т.п.
тип имя_метода(параметры метода);
};
тип имя_класса::имя_метода(параметры метода)
{
// тело метода
}
P.S. Такой способ разделения описания и реализации совпадает с использованием прототипов функций в
C/C++, но в отличие от прототипов, меняет
поведение компилятора при обработке метода!
Исноваоченьпростойкласс
class MyClass { private:
int count; public:
MyClass();
~MyClass();
int printHello();
int getCount() const;
int setCount(int newCount)
};
MyClass::MyClass() { count = 0; } MyClass::~MyClass() {}
int MyClass::printHello() { cout << "Hello!"; } int MyClass::getCount() const { return count; } int setCount(int newCount) { count = newCount; }
Размещениеклассоввпроектах
Общепринятаяпрактикаразмещение
объявленийклассоввзаголовочныхфайлах*.h, аихреализации– вфайлах*.cpp (*.cxx).
Довольночасто:1класс1модуль(.h + .cpp).
Повышениемодульностипроекта
Каждыйклассможетбытьподключендля
дальнейшегоиспользованияприпомощи директивы#include “имязаголовочного файла”
Привнесенииизмененийвреализацию методаклассаперекомпиляцииподвергнутся толькоизмененныефайлы
Пример
date.h
class Date
{
public:
void Next(); void Print();
private:
int m_day; int m_month; int m_year;
};
date.cpp
#include “date.h”
void Date::Next()
{
// ...
}
void Date::Print()
{
// ...
}
lab10.cpp
#include “date.h”
int main()
{
Date date1; // ...
return 0;
}
Размещениеклассоввпроектах
Общепринятаяпрактикаразмещение
объявленийклассоввзаголовочныхфайлах*.h, аихреализации– вфайлах*.cpp (*.cxx).
Довольночасто:1класс1модуль(.h + .cpp).
Повышениемодульностипроекта
Каждыйклассможетбытьподключендля
дальнейшегоиспользованияприпомощи директивы#include “имязаголовочного файла”
Привнесенииизмененийвреализацию методаклассаперекомпиляцииподвергнутся толькоизмененныефайлы
Инициализацияатрибутовв описанииконструктора
имя_класса::имя_класса() : атрибут1(значение1), атрибут2(значение2) … {}
Такойспособинициализацииидентичен простомуприсваиваниювтеле конструктора,нокомпилятор генерируетболееоптимальныйкод.
Объявлениеэкземпляровкласса
Вариант1:
имя_класса идентификатор;
Вариант2:
имя_класса идентификатор(аргументы);
Примеркласса,содержащего
векторзначенийтипаdouble
#include <iostream> using namespace std; class DoubleVector { private:
double * data; unsigned length;
public:
DoubleVector(); DoubleVector(unsigned l); ~DoubleVector();
void SortAsc() {/* не реализовано */}; void SortDesc() {/* не реализовано */};
unsigned GetLength() const { return length; }; void SetLength(unsigned newLength);
double *GetAllData() const { return data; }; double GetElement(int i) const { return data[i]; } void SetElement(int i, double el) { data[i] = el; }
};
Примеркласса,содержащего
векторзначенийтипаdouble
DoubleVector::DoubleVector()
{
length = 0;
cout << "Created!" << endl;
}
DoubleVector::DoubleVector(unsigned l) : length(l)
{
data = new double[l];
cout << "Created!" << endl;
}
DoubleVector::~DoubleVector() { delete data;
cout << "Destroyed!" << endl;
}