#include using namespace std; class A { size_t n; double *x; public: double & operator[](int i) { return x[i]; } const double & operator[](int i) const { return x[i]; } size_t Size() const { return n; } A(size_t nn) { n = nn; x = new double[nn]; cout << "base A()\n"; } A(const A & b) { x = new double[b.n]; n = b.n; for (size_t i = 0; i < n; i++) x[i] = b.x[i]; cout << "copy A()\n"; } A(A &&b) { x = b.x; n = b.n; b.x = nullptr; b.n = 0; cout << "move A()\n"; } const A & operator=(const A& b) { delete [] x; x = new double[b.n]; n = b.n; for (size_t i = 0; i < n; i++) x[i] = b.x[i]; cout << "copy =\n"; return *this; } const A & operator=(A&& b) { int m = n; n = b.n; b.n = m; double *p = x; x = b.x; b.x = p; cout << "move =\n"; return *this; } // A operator+(const A &b) const { // A s(n); // for (size_t i = 0; i < n && i < b.n; i++) s[i] = x[i] + b.x[i]; // return s; // } friend A operator+(const A &a, const A &b); friend ostream & operator<<(ostream &os, const A &a); }; A operator+(const A &a, const A &b) { A s(a.n); for (size_t i = 0; i < a.n && i < b.n; i++) s[i] = a[i] + b[i]; return s; } ostream & operator<<(ostream &os, const A &a) { os << "A: "; for (size_t i = 0; i < a.n; i++) os << " " << a[i]; os << endl; return os; } int main() { A a(3); a[0] = a[1] = a[2] = 1; cout << "a " << a; A b(3); b[0] = b[1] = b[2] = 2; cout << "b " << b; A c(a); cout << "c " << c; cout << "A d(move(a)) ------------\n"; A d(move(a)); cout << "d " << d; cout << "a " << a; cout << "c = b ------------\n"; c = b; cout << "b " << b; cout << "c " << c; cout << "b = c + d ------------\n"; b = c + d; cout << "b " << b; cout << "c " << c; cout << "d " << d; cout << "c = move(b) ------------\n"; c = move(b); cout << "b " << b; cout << "c " << c; cout << "A f(b + c); ------------\n"; A f(b + c); cout << "f " << f; cout << "b " << b; cout << "c " << c; return 0; }