Перегрузка операций. Пример

C++ позволяет переопределить действие большинства операций так, чтобы они при использовании с объектами конкретного класса они выполняли заданные функции. Это дает возможность использовать собственные типы данных так же, как стандартные. Обозначения собственных операций вводить нельзя. Можно перегружать любые операции, существующие в C++, за исключением:

. .* ?: :: # ## sizeof

перегрузка операций осществляется с помощью методов специального вида(функций-операций) и подчиняется следующим правилам:

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

б)для стандартных типов данных переопределять операции нельзя

в)функции-операции не могут иметь аргументов по умолчанию

г)функции-операции наследуются(за исключением =)

д)функции-операции не могут определяться как static

Функция-операция определяется либо как метод класса, либо дружественная функция, либо обычной функцией

Пример(при определении внутри класса):

class monstr{

...

bool operator > (const monstr &M){

if(health>M.health) return true;

return false;

}

};

Роль ссылок в борьбе за эффективность. Пример.

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

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

 

void f(Monster x);

void g(const Monster& x);

...

Monster barmaley;

f(barmaley); // будет создаваться копия монстра barmaley, а после выполнения функции - уничтожаться.

g(barmaley); // Функция получит адрес barmaley. Kопию создавать не надо.

 

По этой причине параметры длинее 8 байтов почти всегда передаются по ссылке.Ссылки полезны и в циклах по элементам массива.

for (int i = 0; i < 10; i ++)

{

double& x = a[i];

if (x > 1)

x = 1;

if (x < 0)

x = 0;

x = x * x;

}

Во всех этих случаях можно было бы использовать указатель, и в Си так и делается, но, как сказано выше, указатели опасны. К тому же писать звёздочки и амперсанды - утомительно.Но по-настоящему необходимы ссылки для перегрузки операторов, о которой пойдёт речь в следующих разделах. Так, например, что ++ обычно понимается как изменяющая свой аргумент, потому ::operator++(T) обычно обязана иметь ссылку в параметре - т.е. ::operator++(T&)

Точно так же operator[] обычно понимается как возвращающая lvalue, что требует T& Arr::operator[](int index);

 

Инициализация объектов. Варианты конструкторов. Пример

Объекты инициализируются с помощью конструктора. Конструктор вызывается при создании и инициализации объекта данного типа; деструктор — при уничтожении. Существуют два типа конструкторов -конструктор копирования и конструктор преобразования.

Пример:

Array::Array(const Array&)