- •1. Объектно-ориентированное программирование как методология проектирования программных средств.
- •1.2. Объект
- •Iarray a(10), b(25), c(45);
- •Int main(void)
- •2.1. Перегрузка имен функций
- •Int print(int);
- •Void print(int);
- •Int (*matrix)[10];
- •Void main(void)
- •Void incr(int &aa)
- •3.2 Объявление класса.
- •Имя_класса имя объекта;
- •Имя объекта. Имя элемента
- •Имя_объекта. Имя_метода( );
- •Имя класса *this;
- •Имя_класса (список формальных параметров)
- •Листинг 3.4
- •V_3d( double &X, double &y,double &z)
- •Void main(void)
- •Х:: х(const х&)
- •V_3d::v_3d(const v_3d& v1)
- •Void v_3d::print()
- •Сlass X
- •Void main (void)
- •4. Перегрузка операций
- •V_3d(double x1,double y1,double z1)
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.1. Использование дружественных функций при перегрузке операций
- •Void print();
- •Void main(void)
- •Void v_3d::print()
- •4.3.2.Особенности использования дружественных функций
- •Имя объекта. Имя_функции
- •Void f1( X& );
- •Void f2 ( X* );
- •Void main(void)
- •5. Производные классы
- •Int Bfunc( );
- •Int Xfunc( );
- •Int Efunc( X & x1 );
- •Istream
- •Iostream
- •Ifstream
- •С помощью манипуляторов – специальных операций, вставляемых непосредственно в поток вывода.
- •Int width( int w);
- •Int precision( int p);
- •Void main(void)
- •Void open(char* filename, int mode, int access);
- •If(!fout) {
- •7. Виртуальные функции
- •Circle a;
- •A.Build();
- •Virtual double a(double X)
- •Void main (void)
- •Void Graphics Object :: Build() { };
- •8.Шаблоны функций и классов
- •Void main(void)
- •Void Swap ( SwapType &X, SwapType &y)
- •Void main(void)
- •Int a, double b;
- •Int sloc,rloc;//начало и конец очереди
- •Void qput(t I); // помещение элемента в очередь
- •Int main(void)
- •1.Какой принцип ооп реализуется с помощью шаблонных функций и классов?
- •2.Когда целесообразно использовать шаблоны функций? Каков общий вид объявления шаблона функции?
3.2 Объявление класса.
Объявление класса можно выполнить следующим образом:
Ключ_класса имя_класса<: базовый список>
{
список элементов
};
где
ключ класса –это одно из служебных слов class, struct, union;
имя класса – произвольно выбираемый идентификатор;
список элементов –определения и описания элементов-данных и принадлежащих классу функций. Элементы – данные класса могут быть как базовых, так и производных типов, т.е. данными могут быть переменные, массивы, указатели и т.д.
Объявление класса создает уникальный тип, тип класса имя класса. Это позволяет объявить последующие объекты класса данного типа.
С++ позволяет также неполное объявление класса, например:
class X;
stuct Y;
union Z;
Неполные объявления позволяют делать в программе ссылки к именам классов до того, как классы будут полностью определены.
Все компоненты класса в английском языке обозначаются термином member (член, элемент, часть). Функции, принадлежащие классу, обозначаются термином member function, а данные класса имеют название data members. В русском языке терминология, относящаяся к классам, недостаточно устоялась, поэтому в литературе имеются многочисленные расхождения. Данные класса называют компонентными данными или элементами данных объектов класса. Принадлежащие классу функции называют методами класса или компонентными функциями.
Необязательный базовый список перечисляет базовые классы, наследником которых (производным от которых) является данный класс.
Например, объявим класс “вектор”:
Листинг 3.1.
class V_3d
{
// описания элементов-данных объединены в одном операторе
double x,y,z; // координаты вектора в трехмерной системе координат
public:
// функция – метод класса для вычисления модуля вектора
double mod( )
{
return sqrt (x*x+y*y+z*z);
};
};
Таким объявлением класса определен не просто отдельный объект – трехмерный вектор, а любой произвольный вектор. Здесь задан целый класс объектов.
Примечание.
В отличие от обычного определения данных при описании элементов класса не допускается их инициализация. Это естественное свойство класса, так как при его определении еще не существует участков памяти, соответствующих его элементам-данным. Память выделяется не для класса, а только для объектов класса. Для инициализации элементов-данных объектов должны использоваться специальные функции, называемые конструкторами.
Служебное слово public делит тело класса на две части. Первая часть, до слова public по умолчанию является закрытой. Это означает, что имена в этой части – x, y, z могут использоваться только функциями – методами класса. Вторая, открытая часть, составляет интерфейс к объекту класса. Служебное слово public определяет, что метод класса – функция mod( ) является общедоступной, то есть может быть вызвана из любого места программы.
В свойстве класса ограничивать доступ к переменным, объявленным внутри него, реализуется такой принцип ООП, как инкапсуляция. Что дает инкапсуляция программисту: внутреннюю реализацию класса можно изменять, не опасаясь, что это повлечет нежелательные побочные эффекты в остальной части программы.
Для фрагмента программы из листинга 3.1. инкапсуляция означает, что любая ошибка, приводящая к тому, что модуль вектора принимает недопустимое значение, может быть вызвана только принадлежащей функцией mod( ).
Инкапсуляция позволяет уменьшить время отладки программы за счет локализации участка программы, содержащего ошибку.
3.3. Управление доступом к элементам класса
Элементы класса получают атрибуты доступа, либо по умолчанию (в зависимости от ключа класса) либо при использовании спецификаторов доступа:
public (общедоступный),
private (собственный),
protected (защищенный).
Спецификатор public означает, что элементы общедоступны всем функциям, в том числе и не методам класса.
Спецификатор private определяет, что элементы могут быть использованы только функциями методами и “друзьями” классов.
Спецификатор protected определяет те же права доступа, что и private, но дополнительно элементы могут быть использованы и методами- наследниками данного класса. Защищенные (protected) элементы классов нужны только в случае построения иерархии классов. Если наследование классов не используется в программе, то применение спецификатора protected эквивалентно использованию спецификатора private.
По умолчанию права доступа к элементам класса зависят от ключа класса:
- class-определяет право доступа как private;
- struct- определяет право доступа как public, но можно переопределить это умолчание при помощи спецификаторов доступа private и protected;
- union- определяет право доступа как public и переопределить его нельзя.
Хорошим стилем в ООП является сокрытие данных и общедоступность методов для вызова их из любого места.
Спецификатор доступа по умолчанию или заданный для переопределения атрибута доступа является действительным для всех последующих объявлений элементов, пока не встретится другой спецификатор доступа, как показано в листинге 3.2.
Листинг 3.2.
class Х {
int i; // i и ch имеют по умолчанию право доступа
char ch; // private
public:
int j; // j и k являются общедоступными
int k;
protected:
int l;..// l объявлен как защищенный элемент
};
struct Y
{
int i; // i по умолчанию имеет право доступа public
private:
int j; // j объявлен как защищенный элемент класса
public:
int k; // k является общедоступным элементом
};
union Z
{
int i; // public по умолчанию, других
double d; // вариантов нет
};
3.4 Объекты классов
Объект класса – это переменная, объявленная как принадлежащая классу. Для описания объекта класса используется конструкция:
