- •«Объектно–ориентированное программирование»
- •1. Объектно–ориентированный подход к разработке программного беспечения: основные понятия, концепции и принципы.
- •Void main(){ demo a("Ok"), b(a); a.Out(); b.Out();}
- •X(); // derived class
- •Int size;
- •Vector(int);
- •Void main() {
- •Void noex(int I) throw();
- •10. Библиотека stl: назначение, основные элементы.
- •Void main(){try{ throw 10; }
- •Void foo() throw(int,over_flow);
- •11. Контейнеры stl: понятие, виды, основные операции, приемы использования.
- •12. Итераторы stl: понятие, виды, основные операции, приемы использования.
- •Int main()
Int size;
public:
Vector(int);
~Vector( ) { delete[ ] data; }
T& operator[ ] (int i) { return data[i]; }
};
// Note the syntax for out-of-line definitions.
template <class T> Vector<T>::Vector(int n) {
data = new T[n];
size = n;
};
Void main() {
Vector<int> x(5); // Generate a vector to store five integers
for (int i = 0; i < 5; ++i)
x[i] = i; // Initialize the vector.
}
В списке_параметров_типов собственно параметры типов указываются с ключевым словом class, а параметры констант - с какими-либо другими ключевыми словами, применяемыми для идентификации типа.
Функции-члены шаблона класса автоматически являются шаблонами функций, т.е. они могут использовать параметр типа шаблона класса, не требуя его явного описания в шаблоне функции. Шаблоны функций, которые являются членами класса, нельзя описывать как virtual. Т.о. реализация функции-члена шаблона класса, которая находится вне определения шаблона класса, должна дополнительно включать следующие два элемента:
Определение должно начинаться с ключевого слова template, за которым следует такой же список_параметров_типов, какой указан в определении шаблона класса.
За именем_класса, предшествующим оператору разрешения видимости, должен следовать список_имен_параметров шаблона.
Пример определение функции-члена шаблона класса:
template <class T, class S> class demo {T var1; S var2;
public: T func(void);};
template <class T, class S> T demo<T,S>::func(void) { return var1;}
8. Перегрузка методов и операций: виды и применение. Примеры на С++.
С++ позволяет определить несколько функций с одним и тем же именем, если эти функции имеют разные наборы параметров и/или разные типы параметров. Эта особенность называется перегрузкой функции. При вызове перегруженной функции компилятор С++ определяет соответствующую функцию путём анализа количества, типов и порядка следования аргументов в вызове. Перегруженные функции обычно используется для создания нескольких функций с одинаковым именем, предназначенных для выполнения сходных задач, но с различными типами данных, что делает программы более понятными и легко читаемыми.
Пример:
double Area (double R) {return 6.28318*R*R;}
double Area (double a, double b) {return a*b;}
Перегрузка операций - это возможность использовать знаки стандартных операций для записи. Все существующие операции могут быть перегружены, за исключением: . .* :: ?: и sizeof. Следующие символы препроцессора также не могут быть перегружены: # ##. Операции =,[ ],( ) и -> могут быть перегружены только как нестатические функции-элементы. Они не могут быть перегружены для перечислимых типов.
Чтобы использовать операцию над объектами классов, эта операция должна быть перегружена, но есть два исключения. Операция присваивания (=) может быть использована с каждым классом без явной перегрузки. По умолчанию операция присваивания сводится к побитовому копированию данных-элементов класса. Операция адресации (&) также может быть использована с объектами любых классов без перегрузки; она просто возвращает адрес объекта в памяти. Но операцию адресации можно также и перегружать.
В языке С++ для перегрузки операций используется ключевое слово operator, с помощью которого определяется специальная операция-функция (operator function).Ее формат:
тип_возвр_значения operator
знак_операции (специф_параметров)
{операторы_тела_функции}
Перегрузка унарных операций:
Любая унарная операция может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. В первом случае выражение Z означает вызов Z.operator (), во втором вызов operator (Z).
Унарные операции, перегружаемые в рамках определенного класса, могут перегружаться только через нестатическую компонентную функцию без параметров. Вызываемый объект класса автоматически воспринимается как операнд.
Унарные операции, перегружаемые вне области класса (как глобальные функции), должны иметь один параметр типа класса.
в 1 случае (в области класса): тип_возвр_значения operator знак_операции
во втором случае (вне области класса): тип_возвр_значения operator знак_операции(идентификатор_типа)
Перегрузка бинарных операций
Любая бинарная операция может быть определена двумя способами: либо как компонентная функция с 1 параметром, либо как глобальная функция с 2 параметрами.
Операции, перегружаемые внутри класса, могут перегружаться только нестатическими компонентными функциями с параметрами.
Операции, перегружаемые вне области класса, должны иметь два операнда, один из которых должен иметь тип класса.
class Complex{
public:
Complex( float re, float im );
Complex operator+( Complex &other );
friend Complex operator+( int first, Complex &second );
private: float real, imag; };
Complex Complex::operator+( Complex &other )
{ return Complex( real + other.real, imag + other.imag ); };
Complex operator+( int first, Complex &second )
{return Complex( first + second. real, second.imag ); }
9. Обработка исключений. Примеры на языке С++.
С++ обеспечивает встроенный механизм обработки ошибок, называемый обработкой исключительных ситуаций. Обработка исключительных ситуаций в С++ строится с помощью трех ключевых слов: try, catch, throw. Операторы программы, во время выполнения которых вы хотите обеспечить обработку исключительных ситуаций, располагаются в блоке try. Если исключительная ситуация (т.е. ошибка) имеет место внутри блока try, искусственно она генерируется (с помощью throw). Перехватывается и обрабатывается исключительная ситуация с помощью ключевого слова catch. Любой оператор, который генерирует исключительную ситуацию, должен выполняться внутри блока try. (Функции, которые вызываются внутри блока try также могут генерировать исключительную ситуацию). Любая исключительная ситуация должна перехватываться оператором catch, который следует непосредственно за блоком try, генерирующим исключительную ситуацию.
try { // блок try}
catch (type1 arg1) { // блок catch}
catch (type2 arg2) { // блок catch}
Блок try должен содержать ту часть программы, в которой вы хотите отслеживать ошибки. Это могут быть несколько операторов внутри одной функции, так и все операторы функции main() (что естественно вызывает отслеживания ошибок во всей программе).
Оператор throw должен выполняться либо внутри блока try, либо в любой функции, которую этот блок вызывает. Синтаксически выражение throw появляется в двух формах.
throw; или throw выражение;
Выражение throw устанавливает исключение. Самый внутренний блок try, в котором устанавливается исключение, используется для выбора оператора catch, который обрабатывает исключение. Выражение throw без аргумента повторно устанавливает текущее исключение. Обычно оно используется для дальнейшей обработки исключения вторым обработчиком, вызываемый из первого.
Рассмотрим пример работы исключительной ситуации.
