Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция9.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
124 Кб
Скачать

Int Left; // элементы данных класса

int Top; // элементы данных класса

int Right; // элементы данных класса

int Bottom; // элементы данных класса

public:

void Draw() // метод – компонентная

// функция

{ Line(Left, Top, Right, Top);

Line(Right, Top, Right, Bottom);

Line(Right, Bottom, Left, Bottom);

Line(Left, Bottom, Left, Top);

}

}

Элементы класса получают атрибуты доступа либо по умолчанию (private), либо при использовании какого-либо из трех спецификаторов доступа:

  1. public Компонент доступен для любой функции.

  2. protected Компонент может быть использован методами или “друзьями” класса, в котором он объявлен, а также в производных от него, но только в объектах производного класса.

  3. private Компонент может быть использован только методами или “друзьями” класса, в котором он объявлен.

Так как доступ к элементам данных закрыт, класс должен обеспечить альтернативное средство для пользователя, чтобы указать координаты прямоугольника перед его рисованием.

Необходимо реализовать метод для инициализации элементов данных.

Пример:

void SetCoord (int L, int T, int R, int B)

{ Left=L; Top=T; Right=R; Bottom=B; }

void main()

{

CRectangle Rect;

Rect.SetCoord(25,25,100,100);

Rect.Draw();

}

Теперь нужен метод для получения текущих координат прямоугольника:

void GetCoord (int *L, int *T, int *R, int *B)

{ *L=Left; *T=Top; *R=Right; *B=Bottom; }

Определение класса согласно принципу инкапсуляции:

class CRectangle

{ private:

int Left; // элементы данных класса

int Top; // элементы данных класса

int Right; // элементы данных класса

int Bottom; // элементы данных класса

public:

void Draw() // метод – компонентная

// функция

{ Line(Left, Top, Right, Top);

Line(Right, Top, Right, Bottom);

Line(Right, Bottom, Left, Bottom);

Line(Left, Bottom, Left, Top);

}

void SetCoord (int L, int T, int R, int B)

{ Left=L; Top=T; Right=R; Bottom=B; }

void GetCoord (int *L, int *T, int *R, int *B)

{ *L=Left; *T=Top; *R=Right; *B=Bottom; }

}

Преимущества инкапсуляции:

  1. Инкапсуляция позволяет разработчику класса проверять правильность значений элементов данных и таким образом предотвращать ошибки программирования.

  2. Автор класса свободно может изменить конструкцию структур данных без изменения других частей программы, которые использует класс.

  3. Инкапсуляция исключает зависимость пользователя класса от специального внутреннего представления данных.

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

Конструктор – это специальный метод класса для инициализации элементов данных.

Конструктор вызывается автоматически при создании объекта и выполняет различные задачи инициализации при подготовке объекта к использованию.

Конструктор имеет имя класса, не имеет возвращаемого значения и может иметь любое число параметров (≥0).

Пример:

class CRectangle

{ private:

int Left, Top, Right, Bottom;

public:

void Draw();

void SetCoord(int L, int T, int R, int B);

void GetCoord(int *L, int *T, int *R, int *B)

//Конструктор

CRectangle(int L, int T, int R, int B)

{

SetCoord(L, T, R, B);

}

}

Вызов конструктора при определении объекта:

CRectangle Rect(25,25,100,100);

CRectangle *PRect=new CRectangle(25,25,10,10);

Оператор new автоматически вызывает конструктор для созданного им объекта.

Пример:

void main()

{ CRectangle Rect(25,25,100,100);

Rect.Draw();

}

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

Конструктор без параметров называется конструктором по умолчанию. Конструктор по умолчанию инициализирует элементы данных по умолчанию.

Пример:

class CRectangle

{ private:

int Left, Top, Right, Bottom;

public:

void Draw();

void SetCoord(int L, int T, int R, int B);

void GetCoord(int *L, int *T, int *R, int *B)

//Конструктор

CRectangle(int L, int T, int R, int B);

CRectangle()

{

Left=Top=Right=Bottom=0;

}

}

Объявление объекта:

CRectangle Rect;

Конструктор с одним и более параметрами, которые имеют значения по умолчанию, является конструктором по умолчанию (так как он может быть вызван без параметров).

Если конструктор не определен, компилятор генерирует конструктор по умолчанию, но не инициализирует элементы данных.

Перегружаемые конструкторы

Перегружаемые конструкторы подобны перегружаемым функциям, они обеспечивают альтернативный путь инициализации объекта.

Пример:

class CRectangle

{ private:

int Left, Top, Right, Bottom;

public:

void Draw();

void SetCoord(int L, int T, int R, int B);

void GetCoord(int *L, int *T, int *R, int *B)

//Два конструктора в одном классе

CRectangle(int L, int T, int R, int B);

CRectangle();

}

Использование перегружаемых конструкторов:

void main()

{ CRectangle Rect1(25,25,100,100);

CRectangle Rect2;

Rect1.Draw();

}

Если класс имеет конструктор, то компилятор не генерирует конструктор по умолчанию.

Инициализация данных в конструкторе

Конструктор класса CRectangle инициализирует данные, используя оператор присваивания. Однако определенным типам данных, особенно const и ссылкам, не могут быть присвоены значения. Для решения этой проблемы С++ предоставляет специальный конструктор, который называется списком инициализации. Он позволяет инициализировать один или более элементов данных (а не присвоить им значения).

Список инициализации данных помещается непосредственно после списка параметров в определении класса. Он содержит ‘:’ с последующими инициализаторами, отделенными друг от друга запятыми. Инициализатор содержит имя элемента данных с последующим начальным значением в ():

Имя_класса(Список_параметров):

Инициализатор(Нач.знач.),….

{ Код Конструктора}

Пример:

class C

{ private:

int N;

const int CInt;