123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // uselessm.cpp -- an otherwise useless class with move semantics
- #include <iostream>
- #include <utility>
- using namespace std;
- // interface
- class Useless
- {
- private:
- int n; // number of elements
- char * pc; // pointer to data
- static int ct; // number of objects
- void ShowObject() const;
- public:
- Useless();
- explicit Useless(int k);
- Useless(int k, char ch);
- Useless(const Useless & f); // regular copy constructor
- Useless(Useless && f); // move constructor
- ~Useless();
- Useless operator+(const Useless & f)const;
- // need operator=() in copy and move versions
- void ShowData() const;
- };
- // implementation
- int Useless::ct = 0;
- Useless::Useless()
- {
- ++ct;
- n = 0;
- pc = nullptr;
- cout << "default constructor called; number of objects: " << ct << endl;
- ShowObject();
- }
- Useless::Useless(int k) : n(k)
- {
- ++ct;
- cout << "int constructor called; number of objects: " << ct << endl;
- pc = new char[n];
- ShowObject();
- }
- Useless::Useless(int k, char ch) : n(k)
- {
- ++ct;
- cout << "int, char constructor called; number of objects: " << ct << endl;
- pc = new char[n];
- for (int i = 0; i < n; i++)
- pc[i] = ch;
- ShowObject();
- }
- Useless::Useless(const Useless & f): n(f.n)
- {
- ++ct;
- cout << "copy const called; number of objects: " << ct << endl;
- pc = new char[n];
- for (int i = 0; i < n; i++)
- pc[i] = f.pc[i];
- ShowObject();
- }
- Useless::Useless(Useless && f): n(f.n)
- {
- ++ct;
- cout << "move constructor called; number of objects: " << ct << endl;
- pc = f.pc; // steal address
- f.pc = nullptr; // give old object nothing in return
- f.n = 0;
- ShowObject();
- }
- Useless::~Useless()
- {
- cout << "destructor called; objects left: " << --ct << endl;
- cout << "deleted object:\n";
- ShowObject();
- delete [] pc;
- }
- Useless Useless::operator+(const Useless & f)const
- {
- cout << "Entering operator+()\n";
- Useless temp = Useless(n + f.n);
- for (int i = 0; i < n; i++)
- temp.pc[i] = pc[i];
- for (int i = n; i < temp.n; i++)
- temp.pc[i] = f.pc[i - n];
- cout << "temp object:\n";
- cout << "Leaving operator+()\n";
- return temp;
- }
- void Useless::ShowObject() const
- {
- cout << "Number of elements: " << n;
- cout << " Data address: " << (void *) pc << endl;
- }
- void Useless::ShowData() const
- {
- for (int i = 0; i < n; i++)
- cout << pc[i];
- cout << endl;
- }
- // application
- int main()
- {
- {
- Useless one(10, 'x');
- Useless two = one; // calls copy constructor
- cout << "object one: ";
- one.ShowData();
- cout << "object two: ";
- two.ShowData();
- Useless three = move(one);
- cout << "object three: ";
- three.ShowData();
- }
- cin.get();
- }
|