Перегрузка операций. Пример
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&)