
- •ПЕРЕГРУЗКА ОПЕРАЦИЙ
- •Можно перегружать:
- •При создании описания класса существует две возможности определения операций:
- •Если унарная перегруженная операция реализована как метод класса, то у него нет параметров.
- •void operator-(Complex c1);
- •Например, X::operator T() – преобразует X в T.
- •Примечание.
- •int main()
- •tiny tiny::operator--(int){ v--;
- •Большие объекты
- •Указатели для этой цели использовать нельзя, т.к. невозможно переопределить интерпретацию операции, если она
- •Пример. Определение класса string.
- •string::string(const string& a)
- •delete s2; delete s1; delete s; return 0;
Большие объекты
При выполнении любой операции функции, реализующей эту операцию, будут передаваться как параметры копии операндов.
Это может привести к неэффективному использованию памяти в случае, если операнды – «большие» объекты, например объекты классов, инкапсулирующих матрицы векторы.
Чтобы избежать избыточного копирования,
можно определять функции с параметрами
типа ссылки на объекты.
Указатели для этой цели использовать нельзя, т.к. невозможно переопределить интерпретацию операции, если она применяется к указателю.
Пример. Определение операции сложения для матриц.
class matrix { int n,k;
double m[1000][1000]; public:
matrix(int n1 =10, int k1=10){n=n1; k=k1;}; friend matrix operator+(const matrix&, const
matrix&); };
matrix operator+(const matrix& arg1, const matrix& arg2) {
matrix sum;
for (int i = 0; i<arg1.n; i++) for (int j=0; j<arg1.k; j++)
sum.m[i][j] = arg1.m[i][j] + arg2.m[i][j]; return sum;
}
Присваивание и инициализация
В случае, если полем класса является указатель, то, для корректного занятия и освобождения памяти, в классе должен быть определён конструктор копирования и перегружена операция присваивания.
Пример. Определение класса string.
class string { char* p;
int size; public:
string(int sz) {
p = new char[size=sz]; printf("Конструктор с Int\n");
}
~string() { delete p;
printf("Деструктор \n");
}
string& operator=(const string&); string(const string&);
};
string& string::operator=(const string& a)
{
if (this !=&a) { delete p;
p = new char[size=a.size]; strcpy(p,a.p);
}
return *this;
}
string::string(const string& a)
{
p=new char[size=a.size]; strcpy(p,a.p);
printf("Конструктор копирования\n");
}
int main()
{
string *s=new string(10); //конструктор с int string *s1=new string(*s); //конструктор
копирования
string *s2=new string(10); //конструктор с int
*s2=*s1;//операция присванивания

delete s2; delete s1; delete s; return 0;
}