Язык С++ и программирование на нем. Рейзлин В.И. - 118 стр.

UptoLike

Составители: 

120
complex operator + (complex a, complex b){
complex result;
result.real () = a.real () + b.real ();
result.imag () = a.imag () + b.imag ();
return result;}
Здесь оба аргумента функции operator + () передаются по значе-
нию, то есть выполняется копирование четырех чисел типа double. По-
добные затраты могут оказаться слишком накладными, особенно если
операция переопределяется над таким, например, классом, как матри-
ца“.
Можно было бы попытаться избежать накладных расходов, пере-
давая по значению не сами объекты, а указатели на них:
complex operator + (complex* a, complex *b){. . .}
Но так поступать нельзя, так как оба аргумента теперь являются
объектами стандартного типа указателями, а переопределение опера-
ций для стандартных типов запрещено.
В этой ситуации необходимо использовать ссылки они не изме-
няют тип операндов, а только влияют на механизм передачи парамет-
ров:
complex operator + (complex &a, complex &b){
complex result;
resul.real () = a.real () + b.real ();
result.imag () = a.imag () + b.imag ();
return result;
}
Тело функции operator + () при этом не изменилось.
Пример: определение операции + для класса stroka:
class stroka {
char *c; // Указатель на строку.
int len; // Длина строки.
public:
stroka (int N = 80): len (0) // Строка, не содержащая информа-
цию;
{i = new char [N +1]; // выделение памяти для массива.
c[0] = ‘\0‘;
} // Конструктор выделяет память для строки и делает ее пустой.