Материал: Программирование на языке высокого уровня Лекции 09.03.01

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Существует возможность в полном смысле этого слова перегрузить какой-либо оператор, то есть определить несколько операций с одинаковым обозначением, но с разными параметрами на входе.

proverka proverka:: operator + (int arg)

{ proverka marazm(0,0); marazm.a=a+arg; marazm.b=b+arg; return marazm;

}

void main()

{proverka q(10,10); proverka w(7,7);

proverka summa(0,0),summa1(0,0); summa=q+w;

summa1=q+5;

}

Тема 40. Обработка исключительных ситуаций.

Для отслеживания всевозможных непредвиденных ситуаций, а также для управления ими, в С++ существует механизм обработки исключительных ситуаций. При выполнении многие стандартных функций в том случае, если их входные параметры оказались некорректными, возникает исключительная ситуация. Для каждой исключительной ситуации определен свой класс, название которого начинается с буквы Е (Exception). Программист имеет возможность явно определить реакцию своей программы на ту или иную исключительную ситуацию.

Чтобы узнать, какая именно исключительная ситуация возникает при выполнении той или иной функции, и возникает ли она вообще,

необходимо воспользоваться системой поиска.

 

Блок

операторов,

который

будет

контролироваться

программистом, берется в фигурные скобки, а перед этим блоком указывается ключевое слово try. Сразу за проверяемым блоком указывается ключевое слово catch, после которого в круглых скобках указывается const Eимя_класса &, а затем в отдельном логическом блоке следует обработчик исключительной ситуации.

С++ позволяет применять несколько catch-блоков, каждый из которых определяет способ обработки своей конкретной ситуации.

try {

Symma->Text = FloatToStrF( StrToFloat (Tsena->Text)* StrToFloat(Ves->Text),ffFixed,7,2);

}

catch ( const EConvertError &)

Программирование на языке высокого уровня 09.03.01

46

{ShowMessage ("Ты ввел текст, дружок");} catch ( const Eoverflow &)

{ShowMessage

("Опять опозорился - слишком большое число");} Если во время выполнения программы возникает исключительная

ситуация и присутствует соответствующий блок catch, то управление сразу передается на него, а все остальные операторы в блоке try пропускаются. Вне зависимости от того, какой catchблок был выполнен, управление будет передано первому оператору, следующему за последним catch-блоком, принадлежащим соответствующему оператору try. Если исключительных ситуаций не случилось, то блоки обработки игнорируются.

Программирование на языке высокого уровня 09.03.01

47

Раздел 6. Введение в объектно-ориентированные элементы языка С++ (часть 2) Лекции 31-34.

Тема 41. Динамическое распределение памяти.

Вязыке С++ для управления динамическим распределением

памяти существуют операции new и delete для простых переменных, а также new[] и delete[] для массивов. Наряду с ними сохранена возможность вызова стандартных функций языка С - malloc(), calloc() и free().

int *ykaz; ykaz= new int;

....

delete ykaz; ykaz= new int[S];

....

delete[] ykaz;

Для простых переменных существует возможность одновременной инициализации переменных при динамическом выделении памяти:

int *tt=new int(90); cout<<*tt<<endl;

Если операция new вызывается для представителя какого-либо класса, то одновременно вызывается конструктор:

proverka *att;

att = new proverka(50,50);

Аналогично, при вызове операции delete для представителя какого-либо класса будет вызван деструктор. Для переменных, для которых память выделяется подобным образом, конструктор не занимается выделением памяти для объектов, а деструктор ее не освобождает. Этим занимаются операции new и delete.

Класс может определять свои собственные операции new и delete (или new[] и delete[] для массивов). Синтаксис заголовка таких перегруженных функций традиционен, например:

void * proverka::operator new[](...)

Тема 42. Понятие о дружественности.

Специальные спецификаторы доступа класса позволяют указывать, могут ли функции вне определенного класса обращаться к его элементам. Может, тем не менее, возникнуть ситуация, когда потребуется обеспечить определенной функции или классу доступ к элементам данного класса, определенным как private или protected. Язык С++ позволяет особо разрешить доступ к любым элементам класса другому классу или функции с помощью ключевого

Программирование на языке высокого уровня 09.03.01

48

слова friend. Это ключевое слово встраивается в качестве оператора описания в определение данного класса:

class proverka { ...

friend class rabota;

... };

Можно также разрешить обычной функции или функции-элементу другого класса полный доступ к элементам класса, объявленным private или protected c помощью описания friend в определении данного класса:

class proverka

{ friend void rabota::tfunc(int); friend void print(const proverka&); };

void print(const proverka& zaval) { cout<<zaval.a<<"#"<<zaval.b<<endl;

}

К друзьям и дружественности приложены следующие правила:

на описания friend не влияют спецификаторы public, protected или private;

описания friend не взаимны, если A объявляет В другом, то это не означает, что А является другом для В;

дружественность не наследуется: если А объявляет В другом, то классы, производные от В, не будут

автоматически получать доступ к элементам А; дружественность не является переходным свойством: если А

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

Тема 43. Наследование классов.

Язык С++ позволяет классу наследовать элементы данных и элементы-функции одного или нескольких других классов. Иначе говоря, новый класс может получать атрибуты и поведение от уже существующего класса. Новый класс называют производным классом. Класс, элементы которого наследуются производным классом, называется базовым классом. В свою очередь производный класс может служить базовым для другого класса.

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

Производный класс может переопределить некоторые функции-

элементы базового, наследуя, тем не менее, основной

объем

свойств базового класса.

 

Синтаксис наследования имеет следующий вид:

 

Программирование на языке высокого уровня 09.03.01

49

class osnova {..........};

class potomok: ключ_доступа osnova {..........};

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

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

Существуют следующие варианты доступа:

Наследование

Доступ в

базовом

Доступ в производном

 

классе

 

классе

 

 

 

 

public

public

 

 

 

protected

 

не меняется

 

private

 

 

 

 

 

 

protected

public

 

protected

 

protected

 

не меняется

 

private

 

не меняется

 

 

 

 

private

public

 

private

 

protected

 

private

 

private

 

не меняется

 

 

 

 

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

class prolet: public proverka { char * stroka;

public: prolet(char *,int,int);

friend void print(const proverka&); void print1 ()

{proverka zaval(a,b); print(zaval); printf("%s",stroka);}

};

prolet::prolet(char *str,int a1,int b1):proverka(a1,b1) {strcpy(stroka,str);}

void main(){

prolet t("Psel von",40,40); t.print1();

}

Программирование на языке высокого уровня 09.03.01

50

Источник: https://studfile.net/preview/16415559/