- •Обзорные лекции по курсу
- •1.Концепции и методология объектно-ориентированного программирования
- •2.Классы. Конструкторы и деструкторы
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Конструкторы и деструкторы. Список инициализации элементов
- •Void Show();
- •Int main()
- •Void Show();
- •Int main()
- •Статические члены класса
- •3. Простое и множественное наследование
- •Int GetX(){return X;}
- •Int GetY(){return у;}
- •Int GetX(){return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ' ;}
- •Void ShowY(){cout « GetY()« ' ';}
- •OutCoord(int _x, int _y): Coord(_x, _y){}
- •Int GetX() {return X;}
- •Int GetY(){return y;}
- •Void ShowX(){cout « GetX() « ' ';}
- •Void ShowY(){cout « GetY()« ' ';}
- •Void ShowX(){cout « Coord::GetX() « ' ';}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Void set_a(int num);
- •Void AnyClass::get_a()
- •Int AnyClass::set_a(int num)
- •Void Show();
- •Int main()
- •Int GetX() {return X;}
- •PrintMsg(int _x, int _y, char* msg): Coord(_x, _y), SaveMsg(msg){}
- •Упражнения для самопроверки
2.Классы. Конструкторы и деструкторы
Понятие класса является ключевым в ООП и в языке C++, где класс – синтаксическая конструкция с широким функциональным наполнением:
class <имя_класса>
{//закрытые функции-члены и данные-члены класса
public:
//открытые функции-члены и данные-члены класса
}
Функции и переменные, указанные внутри объявления класса, становятся членами этого класса. Переменные, указанные внутри объявления класса, называются данными-членами этого класса; функции, указанные внутри объявления класса, называются функциями-членами класса. По умолчанию, все функции и переменные, объявленные в классе, становятся закрытыми для этого класса. Это означает, что они доступны только для других членов этого класса. Для объявления открытых членов класса используется ключевое слово public, за которым следует двоеточие. Все функции и переменные, объявленные после слова public, доступны и для других членов класса, и для любой другой части программы, в которой содержится класс.
Вот пример объявления класса:
class AnyClass
{//закрытый элемент класса
int a;
public:
int get_a();
Void set_a(int num);
};
Хотя функции get_a() и set_a() и объявлены в классе AnyClass, они еще не определены. Для определения функции-члена нужно связать имя класса, частью которого является функция-член, с именем функции. Это достигается путем написания имени функции вслед за именем класса с двумя двоеточиями. Операцию, записываемую в виде двух двоеточий, называют операцией расширения области видимости. Для задания функции-члена используется следующая общая форма:
<Тип> <имя_класса>: : <имя_функции>(<список_параметров>)
{
//тело функции
}
Ниже приведены примеры определения функций-членов get_a() и set_a():
Void AnyClass::get_a()
{
return a;
}
Int AnyClass::set_a(int num)
{
a = num;
}
Объявление класса AnyClass не приводит к созданию объектов типа AnyClass. Чтобы создать объект соответствующего класса, нужно просто использовать имя класса как спецификатор типа данных. Например,
AnyClass ob1, оb2;
После того, как объект класса создан, можно обращаться к открытым членам класса, используя операцию "точка".
Например,
obl.set_a(10) ;
ob2.set_a(37) ;
Эти операторы устанавливают значения переменной а в объектах оb1 и оb2. Каждый объект содержит собственную копию всех данных, объявленных в классе. Это значит, что значение переменной а в оb1 отлично от значения этой переменной в оb2.
Доступ к элементам данных класса можно получить и с помощью указателя на объект этого класса. Следующий пример это иллюстрирует.
class Coord
{
public:
int x,y;
void SetCoord(int _x, int _y);
};
void Coord::SetCoord(int _x, int _y)
{
x = _x;
у = _y;
}
int main()
{
Coord pt;
Coord *ptPtr = &pt; //указатель на объект
//...
pt.x =0; // объект. член_класса
ptPtr->y = 0; //указатель->член_класса
ptPtr->SetCoord(10,20);
//...
return 0;
}
Среди программистов часто возникает спор о том, какой метод доступа к членам класса - через оператор "." или через оператор "->" - работает быстрее. Внесем ясность в этот вопрос. Оператор выбора члена "." работает в точности так же, как оператор "->", за исключением того, что имени объекта предшествует неявно
Язык C++ накладывает определенные ограничения на данные-члены класса:
• данные-члены не могут определяться с модификаторами auto, extern или register;
• данным-членом класса не может быть объект этого же класса (однако данным-членом может быть указатель или ссылка на объект этого класса, или сам объект другого класса).
Имена всех элементов класса (данных и функций) имеют своей областью действия этот класс. Это означает, что функции-члены могут обращаться к любому элементу класса просто по имени.
Класс должен быть объявлен до использования его членов. Однако, иногда в классе должен быть объявлен указатель или ссылка на объект другого класса еще до того, как он определен.
В этом случае приходится прибегать к неполному объявлению класса, которое мы не будем рассматривать.
Доступ к элементам класса обеспечивается посредством спецификаторов доступа, которые применяется ко всем элементам класса, следующими за ним, пока не встретится другой спецификатор доступа или не закончится определение класса. Следующая таблица 6.1 описывает три спецификатора доступа.
Таблица 6.1.
Спецификаторы доступа к классу
Спецификатор |
Описание |
Private :
|
Данные-члены и функции-члены доступны только для функций-членов этого класса. |
Protected:
|
Данные-члены и функции-члены доступны для функций-членов данного класса и классов, производных от него. |
public:
|
Данные-члены и функции-члены класса доступны для функций-членов этого класса и других функций программы, в которой имеется представитель класса. |