Документирование ПО. Основные документы. Программа и методика испытаний. Руководство оператора. Руководство системного программиста. Руководство программиста. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Документирование ПО. Основные документы. Программа и методика испытаний. Руководство оператора. Руководство системного программиста. Руководство программиста.



К ЕСПД относят следующие документы: 1)Техническое задание. 2)Программа и методика испытаний. 3)Руководство пользователя. 4)Руководство системного программиста. 5)Руководство программиста. Программа и методика испытаний. Это документ, который содержит описание действий. Фактически это документ для приема сдаточных работ. Состоит из: 1)Объект испытаний. 2)Цель испытаний. 3)Состав документации. 4)Технические требования А)требования к документации Б)требования к техническим характеристикам. 5)Порядок проведения испытаний. 6)Методы испытаний 7)Дополнительные разделы. Руководство пользователя. Основной документ, описывающий как пользоваться системой. Включает в себя: 1)Назначение программы 2)Условия выполнения (системные требования). 3)Выполнение программы (последовательность действий для запуска, выполнения, завершения работы программы).4)Сообщения оператору (пользователю) (текст сообщений и соответствующие действия) 5)Приложения. Руководство системного программиста. 1)Общие сведения. 2)Структура программы. 3)Настройка программы. 4)Проверка программы. 5)Дополнительные возможности. 6)Сообщения системному программисту. Руководство программиста. 1)Документ, описывающий внутреннюю организацию программы. 2)Назначение и условия применения. 3)Характеристика программы. 4)Обращение программы (процедуры, параметры). 5)Входные/выходные данные. 6)Сообщения. 7)Приложения

8 С++. Понятие класса. Объявление класса. Объявление экземпляров класса. Спецификаторы доступа. Указатель this.

Объявление класса – это определение польз. Типа.

class CMyClass{int v;} v1,v2,v3;struct CmyClass{ int v; } Понятие объекта класса – это экземпляр класса. Объект, элемент типа class. При создании объекта класса в памяти выделяется обл. необх. для размещение данных класса. Объявл. Экземпляров класса: CMyclass v1; Описатели доступа, описание доступа: Ключ слова: public, protected, private. Public – «публичный, обще открытый», доступ к членам класса, объявленного как public имеет любой пользователь класса. Protected – «защищенный», доступ к членам класса объявл. как protected имеют: 1) в данном классе 2) в классах, производных от данного 3)в классах и функциях, объявл. как друж. данному классу(friend). Private – «приватный, частный», доступ к членам класса объявл. как private имеют: 1)в данном классе 2) в классах и функциях, объявл. как друж. данному классу(friend). Пример: class CMycalss{ public: void func1();CMycalss func2(); protected: void func3(); void func4(); private: int v;}

В объявлении класса допускается неоднократное объявление спецификатора. class CMycalss{ public: void func1();CMycalss func2(); protected: void func3(); void func4();public: double e; private: int v; protected: void func11();} Объявление класса с использование ключевого слова class по умолчанию предполагает, что все члены класса без явного объявления какого-либо спецификатора имеют доступ private. Объявление класса с исп. Ключевого слова struct по умолчанию предполагается доступ public. class CMyClass{int v;}= class CMyClass{ private int v;}= struct CMyClass{ private int v;}; struct CMyClass{int v;}=struct CMyClass{ public int v;}= class CMyClass{ public int v;}.

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

this ** this; CMyClass * this; Указатель this явл. Скрытым параметром, который неявно передается в каждую функцию классаза исключением статических Static. Ук. This передается через регист ЕСХ. Для доступа к членам класса внутри функции класса указатель this не требуется использовать. class CMyClass { public: CMyClass (void); {v=0;}(равно thisàv=0;) };, class CMyClass { public: CMyClass (void); {v=0;}(равно thisàv=0;) CMyClassàGetAddress() {return this;}.

9 С++. Конструкторы. Деструктор. Создание и удаление объекта класса.

Конструктор – это функция инициализации объекта, данного класса, имя конструктора совпадает с имене класса. Функция конструктор не имеет возвращаемого значения. class CMyClass { public: CMyClass func2(); protected: void func3();} Допускается использование нескольких конструкторов для одного класса. В этом случае каждый конструктор дожжен иметь специфисный набор параметров.. class CMyClass { public: CMyClass (void); (вызов: CMyClass v1;) CMyClass (int v1); (вызов: CMyClass v2(10);) CMyClass (CMyClass *p); (вызов: CMyClass v3(&v1);)protected: void func3();}. Допускается отсутствие конструктора у класса. В этом случае когда отсутсвует констр. Перем. класса принимает значение не наход. в памяти. Конструктор вызывается при создании объекта. main(){CMyClass v1; ß CMyClass v2(10);ß CMyClass v3(&v1);ß}. Конструктор нельзя выбрать повторно, для объекта данного класса. Конструктор как функцию нельзя вызвать явно. Деструктор – это функция уничтожения или деинициализации объекта данного класса. Имя совпадает с именем конструктора + «~», функция деструктора не имеет возвращаемого значения class CMyClass { public: CMyClass (void); ~CMyClass (void); protected: void func3();}. Деструктор всегда один. Допускается отсутствие деструктора у класса, в этом случае при удалении объекта класса память просто освобождается, без вызова какой-либо функции деинициализации. Деструктор вызывается при удалении объекта класса.

Создание и удаление объектов класса 1) с использованием объявления экземпляра класса 2) с использованием new и delete. 1) main() { CMyClass v(10);}. Объект класса размещается в стеке, конструктор класса вызывается вместе с объявлением класса. Деструктор закрывается вместе с закрытием блока вызыавющего дестр. выз. комп, поэтому деструктор срабатывает всегда. 2) main() { CMyClass *p1; CMyClass *p2; CMyClass *p3; p1=new CMyClass; p1=new CMyClass(10); p3=new CMyClass(p1); delete p1; delete p2; delete p3;}. Объект класса создается в динамической памяти, конструктор вызывается в месте создания объекта, дектруктор вызывается в месте удаления объекта.

10 С++. Функции класса. Объявление функции. Реализация функции. Вызов функции. Встраиваемые функции.

Функции класса (методы). Функции объявленные внутри класса явл. Функциями класса и называются функциями чл. класса. Функцию класса можно вызвать только для обекта данного класса. class CMyClass {public: void func1(void); void func2(void);}. Реализация функций: 1) внутри определения класса 2)вне определения класса. 1) class CMyClass {public: void func1(void){тело функции};; 2) class CMyClass {public: void func1(void);} void CMyClass::func1(void) {тело функции};. Вызов функции. Выполняется сиспользованием стандартного синтаксиса доступа к членам структуры. CMyClass {public: void func1(void);}; void main(){CMyClass v1; v1.func1();CMyClass *p1=new CMyClass; p1àfunc1();}Допускается использование нескольких методов с одинаковыми именами для одного класса. В этом случае каждая функция должна иметь специфичный набор параметров. class CMyClass{public: void func1(void); void func2(int v); void func3(int v, char c);} Механизм объявления нескольких функции с единым именем называется перегрузкой функции. Встраиваемые функции (inline). Это функция реализация которой вставляется в вызываемую функцию вместо вызова функции. Существует два варианта объявить inline функцию 1) Когда реализации функции выполняется внутри определ. Классаж 2) с использованием ключевого слова inline вне опрделения класса. 1) class CMyClass{public: void func1(void){ тело функции };} 2) class CMyClass {public: void func1(void);} inline void CMyClass::func(void){ тело функции }. Если определение класса вынесено в отдельный заголовочный файл, тогда объявление встраиваемой функции с использованием ключевого слова inline должно быть выполнено сразу за определением класса в этом же заголовочном файле или другом заголовочном файле, т.е. реализация функции должна быть доступна в других модулях программы. Встраиваемые функции по определению призваны повысить скорость работы программы за счет исключения из кода части ассемблерных инструкций. Данное определение справедливо, если inline функция имеет небольшой размер.

11 С++. Функции. Передача параметров. Возвращаемое значение. Параметр-массив.

Передача параметров. void f(int v, im &r){v++;r++;}void g(){int i=1; im j=1; f(i,j)}. void f(CMyClass &r);, void f(const CMyClass &r){}; float fsqrt(const float &r); void g (double d){float r; r= fsqrt (r);r= fsqrt (d)}. Возвращаемые значения. Если функция не описана как void она должна возвращать значение. void f() {}, int g() { return 1;}. Double *f(){double d=1; return &d;}. Параметр массива. void f (char *s) – размер массива не известен, определить размер можно только по его содержимому. void f(char *s, int size); void f(vec &v); struct vec {char *p; int s;}, void f(int v[5][4]) и т.д.

12 С++. Функции. Перегрузка имен функций. Перегрузка и возвращаемые типы. Перегрузка и область видимости.

Перегрузка имен функций. Использование одного имени для операций выпол. с различными типами называется перегрузкой. В языке С++ существует перегрузка операторов. void print(int); void print(const char*). Правила сопоставления параметров применяются в следующем порядке по убыванию приоритета. 1) Точное соответствие типов: а)имя массива в указатель массива б) имя функции в указатель на функцию. 2) В соответствие с использованием целочисленных преобразований: charàint, shortàint, unsignedàint, floatàdouble. 3) В соответствии с использованием стандартных преобразований: intàdouble, derived*àbase*,unsignedàint 4) В соответ. за счет многоточия в объявлении функций(…) 5)соответствие достигаемое при помощи преобр. определенных пользователем. Типы значений возвр. функций не учитыв. при перегрузке. Перегрузка и возвращаемые типы. Возвращаемые типы не учавствуют в решении перегрузки. float sqrt(float);double sqrt(double); void f(double d,float f){float fl=sqrt(d); double dl=sqrt(d); fl=sqrt(t); dl=sqrt(t);} Перегрузка и область видимости. Функции объявленные в различных областях видимости namespace не являются перегруженными.

13 С++. Функции. Перегрузка имен функций. Явное разрешение неоднозначности. Разрешение в случае нескольких параметров.

Перегрузка имен функций. Использование одного имени для операций выпол. с различными типами называется перегрузкой. В языке С++ существует перегрузка операторов. void print(int); void print(const char*). Правила сопоставления параметров применяются в следующем порядке по убыванию приоритета. 1) Точное соответствие типов: а)имя массива в указатель массива б) имя функции в указатель на функцию. 2) В соответствие с использованием целочисленных преобразований: charàint, shortàint, unsignedàint, floatàdouble. 3) В соответствии с использованием стандартных преобразований: intàdouble, derived*àbase*,unsignedàint 4) В соответ. за счет многоточия в объявлении функций(…) 5)соответствие достигаемое при помощи преобр. определенных пользователем. Типы значений возвр. функций не учитыв. при перегрузке. Перегрузка и возвращаемые типы. Возвращаемые типы не учавствуют в решении перегрузки. float sqrt(float);double sqrt(double); void f(double d,float f){float fl=sqrt(d); double dl=sqrt(d); fl=sqrt(t); dl=sqrt(t);}

void f1(char); void f1(long); void f2(char*); void f2(long*); void g(int i){f1(i);f2(0);}.Для решения неоднозначности 1) Явное приведение типа: f1((long)i); 2)Дописание еще одной перегруженной функции: void f1(int);. Разрешение в случае нескольких параметров. В процессе выбора среди перегруженных функций имеющих несколько аргументов наилучшее соответствие находится для каждого аргумента в соответствии с приведенными правилами. Вызывается функция у которой наилучшим образом соответствует один аргумент и лучшим либо таким же образом соотв. ост. арг. Если такой функции не найдено вызов считается не однозначным. int pow(int,int)ß int i=pow(2,2); double pow(double, double)ß double d=pow(2.2,2.2);

 

14 С++. Функции. Значения параметров по умолчанию. Неопределенное число параметров.

Значения параметров по умолчанию. Тип параметра по умолчанию проверяется в месте объявления функции и вычисляется в момент вызова, допускается объявление нескольких переменных по умолчанию, можно задавать только в конце списка параметров. Параметр по умолчанию не может быть повторен или изменен в последующих объявлениях той же области видимости.int f(int v,int r=1); Неопределенное число параметров. Существуют функции в описании которых невозможно указать число и типы всех допустимых параметров, тогда список формальных параметров завершается многоточием. int printf(const char* f,…). В функциях с неуказанным числом параметров должен присутствовать хотя бы один явный параметр. Неопределенное число параметров указывается в конце списка.

15 С++. Наследование. Производные классы. Конструкторы и деструкторы базовых и производных классов. Порядок создания и удаления классов и членов классов.

В описании класса можно указать список базовых классов. Имя класса в конструкции базовых классов должны обозначать ранее описанный класс, который называется базовым по отнош. к опр. классу. В этом случае говорят, что класс является производным от своих базовых классов. К членам базового класса, если они только не переопределены в производном классе можно обращаться так, как будто они явл. чл.произвольного класса, в этом случае говорят, что производный класс наследует чл. базового класса. class base{public: int a;} class derived: public base {public: int b;} void f(){base *b=&d; derived d; d.a=1;d.b=2;}. Класс называется прямым базовым, если он находится в списке базовых. Класс называется косвенным базовым, если он сам не явл. прямым базовым, служит базовым для одного из класса в списке базовых.

16 С++. Наследование. Спецификаторы доступа для базовых классов. Доступ к базовым классам. Доступ к членам базового класса. Стандартные преобразования типов.

1)Спецификаторы доступа к базовым класса, определяет доступ к членам базового класса из произвольного класса. Если при описании производного класса для базового указан спецификатор public, то все члены базового класса в производном классе имеют тот же спецификатор. publicà public, protectedà protected, privateà private 2)Если для описания проиводного класса для базового ук. спецификатор protected, то члены базового класса со спец. public в производном доступны как protected, а члены класса со спец. protected и private доступны с таким же спецификаторами. publicà protected, protectedà protected, privateà private. 3) publicà private, protectedà private, privateà private. В производном классе доступ к частным чл. базового класса объявл. как private доступ запрещен. Если только для обеспечения доступа при описании базового класса не используется ключевое friend. Если для базового класса не указан спецификатор доступа, то если он описан как struct по умолчанию предполагается спецификатор public, если как class – private. Описание базового класса как private не влияет на доступ к статическим чл. указ. класса, однако если при обращ. к чл. исп. объект или указатель, который нужно преобразовать, то действуют обычные правила преобразования указателей.

Член производного класса может использовать имя из общей части своего б.к. наравне со всеми другими членами т.е. без указания имени объекта Б и П классы могут иметь члены с одинаковыми именами. Т.е. член может быть переопределен в б.к.

Class A{p:int a,b; void f();}; class B:public A{p:int b,c;}; class C:public B{p:void f();};

С использованием операций разрешения области видимости к члену б.к. логично обратиться явно. В том случае, когда имя члена б.к. переопределено в производном кассе. П.к. сам может выступать в роли б.к. при контроле доступа. Указатели на п.к. может неявно преобразовываться в указатель на однозначно определенный Б.к.

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

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

Описание доступа. Используя уточненное имя можно установить доступ к члену бк к части public или protected описание ПК, это называется описание доступа.

17 С++. Перегрузка операторов. Операторы new и delete. Указание размещения. Перегрузка операторов new и delete.

<тип> operator <символ оператора> (<список параметров>) Перегрузка операторов разрешена только для производных типов (одним из параметров оператора должен быть класс, перегрузку можно выполнять внутри и вне объявления класса). Перегрузка оператора сравнения на равенство внутри объявления класса. class A { int num; public: A(int n){num = n;} int getNum(){return num;} bool operator == (A &rA) { return num == rA.getNum(); }; Вне класса: bool operator == (A &rA1, A &rA2) { return rA1.getNum() == rA2.getNum();} В случае объявления перегрузки оператора и внутри класса и вне класса приоритет отдается оператору реализованному внутри объявления класса. Операторы запрещенные для перегрузки. «.», «.*», «::», «?:», «#», «##». При перегрузке операторов, возвращаемый тип и параметры оператора должны точно совпадать. class A { int num; public: A(int n){num = n;} int getNum(){return num;} bool operator == (A& rA) { return num == rA.getNum();} A& operator = (A& rA) { num = rA.getNum(); return *this; } A& operator += (A&rA) { num += rA.getNum(); return *this; } A& operator ()(int n) { num+=n; return this; } operator int (void) {return num;} };

Операторы new и delete управляют выделением и освобождением динамической памяти.

void* operator new (size_t); void* operator new (size_t< void*); void* operator new (size_t, const std::nothrow_t&); void* operator delete (size_t); void* operator delete (size_t< void*); void* operator delete (size_t, const std::nothrow_t&); примеры: int *I = new int; int *str = new char [10]; A* a = new A (2); delete I; delete str; delete a; Указание размещения. new (size_t,void*)delete (void*, void*) эти два оператора позволяют размещать объекты по указанному адресу. char buf [100]; A* a1 = new A(2); A* a2 = new (buf) A(2); delete a1; delete (buf) a2;//так нельзя a2->~A();//надо так! Перегрузка операторов new и delete. void* operator new (size_t size) {return malloc (size);} void operator delete (void *ptr) { free (ptr); } //перегрузка void* operator new (size_t size) {void* ptr; ptr = malloc (size); memset(ptr,0,size); return ptr; } void* operator delete (void *ptr) { memset(); free (ptr); } Примеры перегрузки операторов new и delete. //простейший garbage collector void * Addr [100]; void* operator new (size_t size) { void* ptr; unsigned count; for (count = 0; count < 100; count ++) { if (Addr[count] == NULL) { ptr = malloc (size); Addr[count] = ptr; return ptr;}}return NULL;} void operator delete (void* ptr) {unsigned count; for (count = 0; count <100; count ++) if (Addr[count] == ptr) {free (ptr); Addr [count] = NULL; return; }}return;} int main ();{memset (Addr,0,sizeof(Addr)); char *p1 = new char [10]; int *p2 = new int [20]; delete p1; delete p2; }//другой пример перегрузки операторов new и delete class A{ public:A(){}; void* operator new (size_t size) {printf ("A.new"); return malloc (size); } void operator delete (void *ptr) {printf ("A.delete"); free (ptr);}}; void* operator new (size_t size){ printf ("Global.new"); return malloc (size); }void operator delete (void *ptr) { printf ("Global.delete");free (ptr);}char *p1; int *p2; A *p3; p1 = new char[10]; //Global.new p2 = new int [20]; //Global.new p3 = new A; //A.new //соответственно для delete

18 С++. Вложенные классы. Локальные классы. Имена локальных типов.

Класс можно описать в определении другого класса, такой класс называется вложенным, имя вложенного класса локально по отношению к объемлющему классу. Вложенный класс находится в области видимости объемлющего класса. Если не считать явного использования указателей ссылок ил объектов, то в описании выложенного класса допустимы имена только имена типов статических членов и элементов перечисленных объектов из объемлющего класса class enclose{public: enclose();~enclose(); class inner {public: inner();~inner();}}. Функции вложенного класса не имеют особых прав доступа к членам объемлющего класса. Они подчиняются обычным правам доступа. Аналогично: функции чл. объемлющего класса не имеют особых прав доступа к членам вложенного класса. Функции и члены представляющие данные, и статические члены из вложенного класса, можно определить в глобальной области видимости

Класс можно описать в определении функции, такой класс называется локальным, имя локального класса считается лок. в объемлющей обл. видимости. А областью видимости локального класса является объемлющая область видимости. В описании локального класса из объемлющей области видимости можно использовать имена типов, статических переменных, внешних переменных и функций, а также элементы перечислений. Объемлющая функция не имеет особых прав доступа к членам локального класса. Функция - чл. локального класса след определять в определении этого класса. Локальный класс не может иметь описание чл. представляющих данных. Имена локальных типов подчиняются тем же правилам областей видимости как и другие имена, т.е. имена типов определенных в описании класса нельзя исп. вне этого класса без уточнения

19 С++. Полиморфизм. Поля типа.

Полиморфизм – свойство объектов принимать различные внешние формы в зависимости от обстоятельств, применительно к ООП полиморфизм означает, что действия, выполняемые одноименными методами, могут различаться в зависимости от того, к какому классу относится тот или иной метод. Полиморфизм объектно-ориентированных языков связан с перегрузкой функций, но не тождественнее (перегрузки), при этом важно иметь в виду, что имена методов и свойств тесно связаны с классами, в которых они описаны. Это обстоятельство обеспечивает надежность работы программы, поскольку исключает применение метода для решения несвойственной ему задачи.

Поля типа. Для того чтобы определить к какому ПК относится объект указатель на который есть бк, есть 4 способа: 1)Берем один вариант, а остальные убираем; 2)Размещаем в бк поля идентификаторов ПК, т.е. в бк добавляем поле типа, которое будет идентификатором ПК 3)Виртуальные функции. Использование поля типа является хорошим решением для небольших программ, недостатком является то, что при увеличении количества ПК увеличивается количество идентификаторов, которые необходимо анализировать, что требует доработки уже напис функции. Трудности использования функций реализации сторонними разработчиками и представлены в виде библиотек.

20 С++. Полиморфизм. Виртуальные функции. Таблица виртуальных функций.

Полиморфизм – свойство объектов принимать различные внешние формы в зависимости от обстоятельств, применительно к ООП полиморфизм означает, что действия, выполняемые одноименными методами, могут различаться в зависимости от того, к какому классу относится тот или иной метод. Полиморфизм объектно-ориентированных языков связан с перегрузкой функций, но не тождественнее (перегрузки), при этом важно иметь в виду, что имена методов и свойств тесно связаны с классами, в которых они описаны. Это обстоятельство обеспечивает надежность работы программы, поскольку исключает применение метода для решения несвойственной ему задачи.

Виртуальные функции объявляются с ключевым словом virtual: Пример: Class base { public: virtual int vf(); }; Виртуальная функция имеет смысл только в случае наследования. Тип указывается в базовом и не может быть переопределен в производном классе. Определение виртуальной функции должно даваться для того класса в котором она была впервые описана. Реализация виртуальной функции может замещена в производном классе. Замещаются только функции с одинаковым именем и типом. Пример: class A { public: A (){}; virtual void Print() {printf (“A”);} }; class D1: public A{ public: D1 () {}; void Print () {printf(“D1”);} }; class D2: public A{ public: D2(){}; void Print () {printf(“D2”);) }; В случае когда базовый класс содержит виртуальную функцию и производный от него содержит одноименную функцию такого же типа говорят, что функция производного класса замещает функцию базового. Однако, если типы функций различны функции считаются разными и механизм виртуальности не действует. Если функция производного класса отличается от виртуальной функции базового только типом возвращаемого значения, это считается ошибкой. Наличие спецификации virtual означает, что функция является членом класса. Виртуальная функция не может быть глобальной. Так же виртуальная функция не может быть статическим членом класса т.к. для вызова виртуальной функции необходимо наличие определенного объекта, который указывает, какую функцию нужно вызывать. Функция, подавляющая виртуальную, сама считается виртуальной. Виртуальную функцию, которая определяется в базовом классе, не обязательно определять в производном. В этом случае при всех вызовах будет использована функция объявленная в базовом классе. Механизм виртуальности при вызове отключается если есть явное уточнение имени. class A {public: A (){}; virtual void f(); }; class B: public A{ public: B(){}; void f(); }; void B::f() { A::f() } Механизм виртуальных функций реализует полиморфизм. Таблицы виртуальных функций. Информация об адресах виртуальных функций собирается компилятором. Компиляторы используют технологию преобразования имени виртуальной функции в индекс в таблице, содержащей указатели на функцию. Такая таблица называется таблице виртуальных функций virtual function table. Каждый объект класса с виртуальными функциями имеет собственную таблицу виртуальных функций. class A {public: A(){}; virtual void f1() {printf ("A.f1");} virtual void f2() {printf ("A.f2");} private: int da; }; class B: public A { public: B(){}; virtual void f1() {printf ("B.f1");} virtual void f2() {printf ("B.f2");} private: int db; }; A* a = new A; A* b = new B;

21 С++. Полиморфизм. Чистая виртуальная функция. Абстрактные классы. Виртуальные и перегруженные функции.

Полиморфизм – свойство объектов принимать различные внешние формы в зависимости от обстоятельств, применительно к ООП полиморфизм означает, что действия, выполняемые одноименными методами, могут различаться в зависимости от того, к какому классу относится тот или иной метод. Полиморфизм объектно-ориентированных языков связан с перегрузкой функций, но не тождественнее (перегрузки), при этом важно иметь в виду, что имена методов и свойств тесно связаны с классами, в которых они описаны. Это обстоятельство обеспечивает надежность работы программы, поскольку исключает применение метода для решения несвойственной ему задачи.

 

Вирт.ф. мб описана в базовом классе без реализации. Такая ф-ия наз чистой виртуальной функцией. ВФ делается чистой при помощи инициализации затора (круг перечеркнут) или null.

Пример: class B { //абстр.класс

Public:

B() {}

Virtual void print () = Null; // чист. Вф

};

Наличие в классе чистой вф означает,что нельзя создать объект данного класса.

Абстрактный класс.

Класс с 1 или несколькими вф называется абстрактным. Объекты абс.кл создавать нельзя. Абстр.класс можно исп только как интерфейс и в качестве базового для других. Если чвф не реализ в произв.классе, то она ост. чистой и в производном классе.Следовательно, произв.класс явл абстрактным. Данный подход исп при поэтапной разработке класса.

Class D: public B {

Public D () {}};

Class D2: public D {

Public D2 () {}

Void Print() {}};

B v1; //ош

D v2; //ош

D2 v3// ok

Абстр.классы нужны для задания интерфейса без уточнение конкретных деталей реализации. Реализ конкр действий вып в произв классе.

 

Виртуальные и перегруженные функции.

Цель – рассмотреть различия между вирт.и перегр.ф-ми.

class В{ class D: public B{

рublic: public:

B() {} D() {}

virtual void f1() void f1()

{ printf (“B::f1”);} { printf (“D::f1”);}

Void f2() void f2()

{ printf (“B::f2”);} { printf (“D::f2”);}

}; };

 

void main ()

{

B*b1=new B;

B*b2=new D;

D*d1=new D;

b1->f1(); //A::f1

b1->f2(); //A::f2

b2->f1(); //D::f1 отлич от перег вир

b2->f2(); //B::f2 отлич от перег вир

d1->f1();//D::f1

d1->f2();//D::f2

};

Класс В – базовый, D - производный

f1-вирт f2- перегр.

Разн между вирт и перегр фун проявл при обращ к объекту через *b2(указатель на базовый класс, которому присвоен адр.объекта произв класса.) Вызов ф-и f1 приводит к вызову ф-и из произв класса,а вызов ф f2 из базового.

 

 

22 С++. Пространство имен. Using-объявление и using-директива.

Пространство имен ( Namespace).

При разработке любой программы имя каждого идентиф долж.быть уникальным, т.е имена классов, переменных и функций должны различаться. В против случае компилятор не сможет корректно скомпилировать прграмму. При разраб крупной программы или библиотеки выбор уникального идентиф становится проблемным, т.к: во 1-х: для удобства программирования имя индентификатора должно быть кратким и емким, а во 2-х: для полученяи уникальности имени, имя инд-ра должно быть достаточно длинным, чтобы не пересекаться с др идентиф. Проблема решается с исп.пространства имен.

ПИ явл механизмом группировки логически связанных идентификаторов.(классов, пременных, функций).

ПИ позволяет решить 3 основных задачи:

1. получение уникального имени идентиф.

2. логич группировка идентиф по какому-либо критерию.

3. разбиение всей программы на логические модули

 

namespace <имя> {

};

Пример: namespace math {

double const pi = 3,14;

double sqrt (double x);

class complex {

}

};

Math::pi;

Math::sqrt(…);

Обращение из любой точки программы,в том числе вне пространства имен.

Если же внутри контекста math, то к переменной можно обращ просто по имени (pi, sqrt(…))

Реализация функций:

Способ 1,когда вне контекста пр-ва имен:

double math::sqrt(double x)

{

};

Способ 2, когда внутри контекста пр-ва имен.

namespace math {

double sqrt(double x)

{

}

};

 

void f():

void math::complex::f()

{

}

namespace math {

void complex::f()

{

}

};

Вложенное пространство имен:

В конт.пр-ва имен допускается вложенность. Вложенность мб неогранич.

namespace math {

namespace const {

double const pi=3,14

};

double sqrt(double x);

class complex {

};

};

 

- - -

math::const::pi

.cpp

namespace math {

#include “File.h”

math::math::consts::pi

}



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 245; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.146.105.137 (0.152 с.)