C ++ генерирует оператор присваивания по умолчанию для каждого class
, который присваивает элемент экземпляра по члену (используя операторы присваивания классов / типов членов).
Если это не предусмотрено, оператор присваивания может быть либо удален (тогда присвоение отклонено), либо перегружен.
Я немного обогатил пример кода OP:
#include <iostream>
class A {
private:
int _mem1, _mem2;
public:
A(): _mem1(0), _mem2(0) { }
A(const A&) = default;
A& operator=(const A&) = default;
void some_ops() { ++_mem1; }
void other_ops() { ++_mem2; }
friend std::ostream& operator << (std::ostream &out, const A &a)
{
return out << "mem1: " << a._mem1 << ", mem2: " << a._mem2;
}
};
int main()
{
std::cout << "A a;\n"; A a;
std::cout << "a: " << a << '\n';
std::cout << "a.some_ops;\n"; a.some_ops();
std::cout << "a: " << a << '\n';
/// I to create a new object and make it equal to a
std::cout << "A b = a;\n"; A b = a;
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "b.some_ops();\n"; b.some_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "a.other_ops();\n"; a.other_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
/// Now I want to make b = a again
std::cout << "b = a;\n"; b = a; // BUG, this will not work, right? <= It should.
std::cout << "a: " << a << ", b: " << b << '\n';
return 0;
}
Выход:
A a;
a: mem1: 0, mem2: 0
a.some_ops;
a: mem1: 1, mem2: 0
A b = a;
a: mem1: 1, mem2: 0, b: mem1: 1, mem2: 0
b.some_ops();
a: mem1: 1, mem2: 0, b: mem1: 2, mem2: 0
a.other_ops();
a: mem1: 1, mem2: 1, b: mem1: 2, mem2: 0
b = a;
a: mem1: 1, mem2: 1, b: mem1: 1, mem2: 1
Демонстрация в реальном времени на coliru
Первый пример кода & ndash; с перегруженным конструктором копирования и оператором присваивания:
#include <iostream>
class A {
private:
int _mem1, _mem2;
public:
A(): _mem1(0), _mem2(0) { }
A(const A &a):
_mem1(a._mem1), _mem2(a._mem2)
{
std::cout << "A::A(const A&) called\n";
}
A& operator=(const A &a)
{
_mem1 = a._mem1; _mem2 = a._mem2;
std::cout << "A& A::operate=(const A&) called\n";
return *this;
}
void some_ops() { ++_mem1; }
void other_ops() { ++_mem2; }
friend std::ostream& operator << (std::ostream &out, const A &a)
{
return out << "mem1: " << a._mem1 << ", mem2: " << a._mem2;
}
};
int main()
{
std::cout << "A a;\n"; A a;
std::cout << "a: " << a << '\n';
std::cout << "a.some_ops;\n"; a.some_ops();
std::cout << "a: " << a << '\n';
/// I to create a new object and make it equal to a
std::cout << "A b = a;\n"; A b = a;
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "b.some_ops();\n"; b.some_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "a.other_ops();\n"; a.other_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
/// Now I want to make b = a again
std::cout << "b = a;\n"; b = a; // BUG, this will not work, right? <= It should.
std::cout << "a: " << a << ", b: " << b << '\n';
return 0;
}
Выход:
A a;
a: mem1: 0, mem2: 0
a.some_ops;
a: mem1: 1, mem2: 0
A b = a;
A::A(const A&) called
a: mem1: 1, mem2: 0, b: mem1: 1, mem2: 0
b.some_ops();
a: mem1: 1, mem2: 0, b: mem1: 2, mem2: 0
a.other_ops();
a: mem1: 1, mem2: 1, b: mem1: 2, mem2: 0
b = a;
A& A::operate=(const A&) called
a: mem1: 1, mem2: 1, b: mem1: 1, mem2: 1
Демонстрация в реальном времени на coliru