Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 7new.rtf
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
294.5 Кб
Скачать

Программирование на языке C++

Лабораторная работа 7

Программа на языке C++. Классы, операторы и потоки.

Цель: Изучить принципы объектно-ориентированного программирования на языке C++. Научится разрабатывать программы, используя классы объектов и работать с потоками ввода/вывода, путем переопределения соответствующих операторов.

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

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

Каждое объявление внутри класса определяет привилегию доступа к именам класса в зависимости от того, в какой секции имя появляется. Каждая секция начинается с одного из ключевых слов: private, protected и public. Пример иллюстрирует обобщенный синтаксис объявления базового класса.

class className

{

private:

<приватные члены данных> <приватные конструкторы> <приватные методы>

protected:

<защищенные члены данных> <защищенные конструкторы> <защищенные методы>

public:

<общедоступные свойства> <общедоступные члены данных> <общедоступные конструкторы> <общедоступный деструктор> <общедоступные методы>

};

Таким образом, объявление базового класса на C++ предоставляет следующие права доступа и соответствующие области видимости:

  • Приватные private имена имеют наиболее ограниченный доступ, разрешенный только методам данного класса. Доступ производных классов к приватным методам базовых классов запрещен.

  • Защищенные protected имена имеют доступ, разрешенный методам данного и производных от него классов.

  • Общедоступные public имена имеют неограниченный доступ, разрешенный методам всех классов и их объектов.

Следующие правила применяются при образовании различных секций объявления класса:

  1. Секции могут появляться в любом порядке, а их названия могут встречаться повторно.

  2. Если секция не названа, компилятор считает последующие объявления имен класса приватными. Здесь проявляется отличие объявлений класса и структуры - последняя рассматривается по умолчанию как общедоступная.

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

  4. Используйте методы для выборки, проверки и установки значений свойств и членов данных.

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

  6. Методы (так же как конструкторы и деструкторы), которые содержат более одной инструкции C++, рекомендуется объявлять вне класса.

Следующий пример представляет попытку наполнить объявление базового класса некоторым конкретным содержанием. Отметим характерное для компонентных классов C++Builder объявление свойства Count в защищенной секции, а метода SetCount, реализующего запись в член данных FCount - в приватной секции.

class TPoint {

private:

int FCount; // Приватный член данных void _fastcall SetCount(int Value);

protected:

_property int Count = // Защищенное свойство

{ read= FCount, write=SetCount };

double x; // Защищенный член данных

double у; // Защищенный член данных public:

TPoint(double xVal, double yVal); // Конструктор |

double getX(); |

double getY() ;

Объявления и определения методов хранятся в разных файлах (с расширениями .h и .срр, соответственно). Пример показывает, что когда методы определяются вне класса, их имена следует квалифицировать. Синтаксис такой квалификации метода, определяющей его область видимости, имеет следующий вид:

<имя класса>::<имя метода>

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

TPoint::TPoint(double xVal, double yVal)

{ // Тело конструктора

void _fastcall TPoint::SetCount( int Value )

{

if ( Value i= FCount ) // Новое значение члена данных? {

FCount = Value; // Запись нового значения Update(); // Вызов метода Update } } double TPoint::getX()

// Тело метода getX, квалифицированного в классе TPoint

}

После того, как вы объявили класс, его имя можно использовать как идентификатор типа при объявлении объекта этого класса (например, TPoint* MyPoint;).