Перегрузка бинарных операций.




Перегрузка унарных операций.

Любая унарная операция @ может быть определена двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. В первом случае выражение @ Z означает вызов Z.operator @(), во втором - вызов operator @(Z).

Пример.class Person {

public:

void operator ++()

{ ++age; }

protected:

int age;

...

};

int main(void)

{ Person John;

++John;

...

} class Person {

protected:

int age;

...

friend void operator ++(Person &);

};

void operator ++(Person &ob)

{ ++ob.age;}

int main (void)

{ Person John;

++John;

...

}

Перегрузка бинарных операций.

Любая бинарная операция @ может быть определена двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x @ y означает вызов x.operator @(y), во втором – вызов operator @(x, y).

 

По разному перегружаются инкремент и декремент:

Префиксная форма:

operator ++();

operator --();

Постфиксная форма:

operator ++(int);

operator --(int);

void operator ++()

{++age; }

void operator ++(int)

{age++; }


 

12. Понятие шаблона, их назначение. Шаблоны классов. Основные свойства.

 

Шабло́ны (англ. template) — средство языка C++, предназначенное для кодирования обобщённых алгоритмов, без привязки к некоторым параметрам (например, типам данных, размерам буферов, значениям по умолчанию).

В C++ возможно создание шаблонов функций и классов.

Шаблоны позволяют создавать параметризованные классы и функции. Параметром может быть любой тип или значение одного из допустимых типов (целое число, enum, указатель на любой объект с глобально доступным именем, ссылка). Например, нам нужен какой-то класс:

class SomeClass {

int SomeValue;

int SomeArray[20];

...

};

Для одной конкретной цели мы можем использовать этот класс. Но, вдруг, цель немного изменилась, и нужен еще один класс. Теперь нужно 30 элементов массива SomeArray и вещественный тип SomeValue элементов SomeArray. Тогда мы можем абстрагироваться от конкретных типов и использовать шаблоны с параметрами. Синтаксис: в начале перед объявлением класса напишем слово template и укажем параметры в угловых скобках. В нашем примере:

template < int ArrayLength, typename SomeValueType > class SomeClass {

SomeValueType SomeValue;

SomeValueType SomeArray[ ArrayLength ];

...

};

Тогда для первой модели пишем:

SomeClass < 20, int > SomeVariable;

для второй:

SomeClass < 30, double > SomeVariable2;

Основные свойства шаблонов классов.

1. Компонентные функции параметризованного класса автоматически являются параметризованными. Их не обязательно объявлять как параметризованные с помощью template.

2. Дружественные функции, которые описываются в параметризованном классе, не являются автоматически параметризованными функциями, т.е. по умолчанию такие функции являются дружественными для всех классов, которые организуются по данному шаблону.

3. Если friend-функция содержит в своем описании параметр типа параметризованного класса, то для каждого созданного по данному шаблону класса имеется собственная friend-функция.

4. В рамках параметризованного класса нельзя определить friend-шаблоны (дружественные параметризованные классы).

5. С одной стороны, шаблоны могут быть производными (наследоваться) как от шаблонов, так и от обычных классов, с другой стороны, они могут использоваться в качестве базовых для других шаблонов или классов.

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

7. Локальные классы не могут содержать шаблоны в качестве своих элементов.

8. Реализация компонентной функции шаблона класса, которая находится вне определения шаблона класса, должна включать дополнительно следующие два элемента:

9. Определение должно начинаться с ключевого слова template, за которым следует такой же список_параметров_типов в угловых скобках, какой указан в определении шаблона класса.

10. За именем_класса, предшествующим операции области видимости (::), должен следовать список_имен_параметров шаблона.

Ключевое слово typename появилось сравнительно недавно, поэтому стандарт[1] допускает использование class вместо typename:

template < class T >

Подробнее: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_C%2B%2B


 

13. Шаблоны функций. Основные свойства.

 

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

 

Простейшим примером служит определение минимума из двух величин.

Если a меньше b то вернуть а, иначе — вернуть b

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

Так выглядит шаблон функции определения минимума:

template < typename T >T min(T a, T b){ return a < b? a: b;}

Для вызова этой функции можно просто использовать её имя:

min(1, 2);min('a', 'b');min(string("abc"), string("cde"));

Ключевое слово typename появилось сравнительно недавно, поэтому стандарт допускает использование class вместо typename:

template < class T >

 

14. Виды отношений классов (ассоциация, агрегация, обобщение, зависимость, инстанцирование).

15. Преобразование типов через конструктор и через переопределение типа.

16. Динамическая идентификация типов (RTTI и рефлексия).

 

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

 

В C++ для динамической идентификации типов[1] применяются операторы dynamic_cast и typeid (определён в файле typeinfo.h), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.

Оператор dynamic_cast пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки или void*.

· Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.

· Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.

· Если целевым типом является void*, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.

Оператор typeid[2] возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе.

#include <iostream>

#include <typeinfo.h>

class Base {

public:

virtual void vvfunc() {}

};

class Derived: public Base {};

 

using namespace std;

int main() {

Derived* pd = new Derived;

Base* pb = pd;

cout << typeid(pb).name() << endl; //prints "class Base *"

cout << typeid(*pb).name() << endl; //prints "class Derived"

cout << typeid(pd).name() << endl; //prints "class Derived *"

cout << typeid(*pd).name() << endl; //prints "class Derived"

delete pd;

}

void my_function(A& my_a)

{

try

{

B& my_b = dynamic_cast <B&>(my_a);

my_b.methodSpecificToB();

}

}

#define P_INT int*
typedef int* p_integer;
P_INT p1, p2; // int* p1, int p2;
p_integer p3, p4; // int* p3, int* p4;


 

17. Стандартная библиотека шаблонов (STL). Понятия контейнера итератора и алгоритма.

 

STL обеспечивает общецелевые, стандартные классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных.

STL строится на основе шаблонов классов, и поэтому входящие в нее алгоритмы и структуры применимы почти ко всем типам данных.

Ядро библиотеки образуют три элемента: контейнеры, алгоритмы и итераторы.

Контейнеры (containers) - это объекты, предназначенные для хранения других элементов. Например, вектор, линейный список, множество.

Ассоциативные контейнеры (associative containers) позволяют с помощью ключей получить быстрый доступ к хранящимся в них значениям. В каждом классе-контейнере определен набор функций для работы с ними. Например, список содержит функции для вставки, удаления и слияния элементов.

Алгоритмы (algorithms) выполняют операции над содержимым контейнера. Существуют алгоритмы для инициализации, сортировки, поиска, замены содержимого контейнеров. Многие алгоритмы предназначены для работы с последовательностью (sequence), которая представляет собой линейный список элементов внутри контейнера.

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

 

 

18. Исключительные ситуации. Особенности механизма обработки исключений. Генерирование и распознавание исключений.

 

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

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

Служебное слово try позволяет выделить в любом месте исполняемого текста программы так называемый контролируемый блок: try { операторы }

Среди операторов, заключенных в фигурные скобки могут быть: описания, определения, обычные операторы языка Си++ и специальные операторы генерации (порождения, формирования) исключений: throw выражение_генерации_исключения;

Когда выполняется такой оператор, то с помощью выражения, использованного после служебного слова throw, формируется специальный объект, называемый исключением. Исключение создается как статический объект, тип которого определяется типом значения выражения_генерации_исключения. После формирования исключения исполняемый оператор throw автоматически передает управление (и само исключение как объект) непосредственно за пределы контролируемого блока. В этом месте (за закрывающейся фигурной скобкой) обязательно находятся один или несколько обработчиков исключений, каждый из которых идентифицируется служебным словом catch и имеет в общем случае следующий формат: catch (тип_исключения имя) { операторы }

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

19. Исключительные ситуации. Перехват любых исключений. Перезапуск любых исключений. Стандартные исключения, иерархия классов.

Catch(…) – (многоточие) обработчик реагирует на любое исключение независимо от его типа.

 

 

20. Делегаты и события.

Делегат – это тип (он также является классом), который представляет собой ссылки на методы с определенным списком параметров и возвращаемым типом.

Применение делегата:

using System;

 

// Объявление делегата

delegate void MyDelegate(string a);

 

Class DelegateExample

{

static void Func(string param)

{

Console.WriteLine("Вызвана функция с параметром {0}.", param);

}

 

public static void Main()

{

// Создание экземпляра делегата

DelegateExample ex = new DelegateExample();

MyDelegate d = ex.Func;

MyDelegate f = new MyDelegate(MyDelegate.Func);

// Вызов функции

d("hello");

f("hello");

}

}

Применение событий:

using System;

 

namespace ConsoleApplication1

{

delegate void UI ();

 

class MyEvent

{

// Объявляем событие

public event UI UserEvent;

 

// Используем метод для запуска события



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: