Классы и их структура. Связь класса с внешней средой. Отношения между классами. Расширения языка С++. Конструкторы и деструкторы. Правила доступности членов класса. Механизм наследования

Страницы работы

Фрагмент текста работы

принадлежащий ему, то эта функция получает право доступа к внутренним элементам класса, например:

class type{

private:

int prm;

public:

friend void ftype(type x,int y);

void ftype(type x,int y);

{ x.prm=y;}

В данном примере  в “дружественной “ классу  функции ftype осуществляется доступ к внутренней переменной prm объекта x, принадлежащего к классу type.

2.2. Отношения между классами

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

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

Рассмотрим пример, иллюстрирующий механизм взаимодействия между базовым и производными классами:

//bassear.h

class basearray

{protected:

int maxitems:                            //максимальное число элементов

int citems;                        //число размещенных элементов

public:                                       //конструктор

basearray(int nitems){maxxitems=nitems; citems=0;};

};

//irray.h

class iarray : public basearray

{private:

int *items;

public:

iarray(int nitems);            //конструктор

_iarrray();                        //деструктор

int putitem(int item)                   //занесение элемента в массив

int getitem(int ind;int &item);    // получение элемента из массива

int count({return citems;});        //получение числа элементов

};

Исходный текст методов класса iarray приведен ниже:

//iarray.cpp

#include “basearray.h”

#include “iarray.h”

iarray:iarray(int nitems):basearray(nitems)     //конструктор

{items=new int[nitems];}

iarray::_iarray()                                   //деструктор

{delete items;}

int iarray::putitem(int item)                  //занесение элемента в массив

{ if (citems<maxitems){

items[citems]=item;

citems++;

return 0;

}

else return –1;

}

int iarray:getitem(int ind,int &item)               //получение элемента из массива

{ if(ind>=0 && ind<citems){

item=items[ind];

return 0;

}

else return –1;

}

int iarray::count(){return citems;};                 //получение числа элементов

В новой версии реализации массива выделен базовый класс basearray, в котором определены общие для массивов составляющие, независимо от типов элементов. В производном классе определен конкретный тип массива. В нашем случае тип массива int, хотя можно определить тип массива как float, как struct и т.п.

Класс iarray наследует от класса basearray конструктор. При создании объекта типа iarray в конструкторе iarray вызывается конструктор basearray. С помощью механизма наследования осуществляется скрытие информации. Появившийся описатель protected говорит о том, что следующие за ним переменные будут доступны в производном и доступны в классах и функциях, не принадлежащим к этим классам.

2.3. Расширения языка С++

ФУНКЦИЯ inline

В функции #define проявляется много необычных эффектов связанных с многократным использованием аргументов. Все проблемы разрешила функция С++ inline, взятая из языка ADA. При обращение к функции с описателем inline не происходит реального вызова, а  исполняется код функции, который транслятор вставляет непосредственно в место обращения.

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

Inline double sqr(double x){return x*x;}

Обычно функция помещается в header-файл- файл с расширением *.h, чтобы функция всегда была “под рукой” у транслятора. Другое ограничение, inline-функции не должны совершать циклы или ассемблерные вставки.

ФУНКЦИЯ OVERLOAD(ПЕРЕЗАГРУЖАЕМЫЕ)

Следующей функцией пришедшей из ADA является функция overload, позволяющая различить функции не только по имени, но и по типу аргумента, например:

double sqr(double x){return x*x;}

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

ПАРАМЕТРЫ ФУНКЦИИ ПО УМОЛЧАНИЮ

Допустим, что вы имеете функцию для вывода матрицы в файл. Как правило, такие функции, для распечатки снабжаются большим количеством описаний, например:

print(matrix a,char *format=”%9.4”,char *title=null);

Задавать значение параметров лучше  только один раз в разделе

Информация о работе