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