Оператор присваивания
Оператор присваивания = используется для копирования значения из правого операнда в левый. В контексте классов этот оператор может быть перегружен для определения того, как объекты одного класса должны копироваться друг в друга. По умолчанию компилятор создает оператор присваивания, который выполняет поверхностное копирование всех нестатических членов класса. Если класс управляет ресурсами (например, динамической памятью), необходимо перегрузить оператор присваивания, чтобы избежать двойного освобождения памяти или утечек. В первый параметр (неявный) передается объект, который нужно изменить (левый операнд), а во второй (явный) - объект, из которого копируется значение (правый операнд).
Синтаксис
ClassName& operator=(const ClassName& other)
{
// copy data from other
return *this;
}
Пример
Давайте рассмотрим класс, который управляет динамическим массивом, и перегрузим для него оператор присваивания, чтобы избежать проблем с памятью:
#include <iostream>
using namespace std;
class Array {
private:
int* data;
int size;
public:
Array(int s) : size(s) {
data = new int[size];
for (int i = 0; i < size; i++) {
data[i] = 0;
}
}
// Copy assignment operator
Array& operator=(const Array& other) {
if (this != &other) {
delete[] data;
size = other.size;
data = new int[size];
for (int i = 0; i < size; i++) {
data[i] = other.data[i];
}
}
return *this;
}
void set(int index, int value) {
if (index >= 0 && index < size) {
data[index] = value;
}
}
int get(int index) const {
return data[index];
}
~Array() {
delete[] data;
}
};
int main()
{
Array a(3);
a.set(0, 1);
a.set(1, 2);
a.set(2, 3);
Array b(3);
b = a; // using copy assignment operator
cout << b.get(0) << " " << b.get(1) << " " << b.get(2) << endl;
return 0;
}
Результат выполнения кода:
1 2 3
Пример
Давайте посмотрим, как работает оператор присваивания по умолчанию для класса без динамических ресурсов:
#include <iostream>
using namespace std;
class Point {
public:
int x;
int y;
Point(int xVal, int yVal) : x(xVal), y(yVal) {}
};
int main()
{
Point p1(1, 2);
Point p2(3, 4);
p2 = p1; // default copy assignment
cout << p2.x << " " << p2.y << endl;
return 0;
}
Результат выполнения кода:
1 2
Смотрите также
-
оператор
operator,
который используется для перегрузки операторов -
конструктор копирования
copy-ctor,
который создает объект как копию другого -
конструктор перемещения
move-ctor,
который создает объект путем перемещения ресурсов -
оператор перемещающего присваивания
move-assign,
который перемещает ресурсы из одного объекта в другой