123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- // stdmove.cpp -- using std::move()
- #include <iostream>
- #include <utility>
- // use the following for g++4.5
- // #define nullptr 0
- // 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;
- Useless & operator=(const Useless & f); // copy assignment
- Useless & operator=(Useless && f); // move assignment
- void ShowData() const;
- };
- // implementation
- int Useless::ct = 0;
- Useless::Useless()
- {
- ++ct;
- n = 0;
- pc = nullptr;
- }
- Useless::Useless(int k) : n(k)
- {
- ++ct;
- pc = new char[n];
- }
- Useless::Useless(int k, char ch) : n(k)
- {
- ++ct;
- pc = new char[n];
- for (int i = 0; i < n; i++)
- pc[i] = ch;
- }
- Useless::Useless(const Useless & f): n(f.n)
- {
- ++ct;
- pc = new char[n];
- for (int i = 0; i < n; i++)
- pc[i] = f.pc[i];
- }
- Useless::Useless(Useless && f): n(f.n)
- {
- ++ct;
- pc = f.pc; // steal address
- f.pc = nullptr; // give old object nothing in return
- f.n = 0;
- }
- Useless::~Useless()
- {
- delete [] pc;
- }
- Useless & Useless::operator=(const Useless & f) // copy assignment
- {
- std::cout << "copy assignment operator called:\n";
- if (this == &f)
- return *this;
- delete [] pc;
- n = f.n;
- pc = new char[n];
- for (int i = 0; i < n; i++)
- pc[i] = f.pc[i];
- return *this;
- }
- Useless & Useless::operator=(Useless && f) // move assignment
- {
- std::cout << "move assignment operator called:\n";
- if (this == &f)
- return *this;
- delete [] pc;
- n = f.n;
- pc = f.pc;
- f.n = 0;
- f.pc = nullptr;
- return *this;
- }
- Useless Useless::operator+(const Useless & f)const
- {
- 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];
- return temp;
- }
- void Useless::ShowObject() const
- {
- std::cout << "Number of elements: " << n;
- std::cout << " Data address: " << (void *) pc << std::endl;
- }
- void Useless::ShowData() const
- {
- if (n == 0)
- std::cout << "(object empty)";
- else
- for (int i = 0; i < n; i++)
- std::cout << pc[i];
- std::cout << std::endl;
- }
- // application
- int main()
- {
- using std::cout;
- {
- Useless one(10, 'x');
- Useless two = one +one; // calls move constructor
- cout << "object one: ";
- one.ShowData();
- cout << "object two: ";
- two.ShowData();
- Useless three, four;
- cout << "three = one\n";
- three = one; // automatic copy assignment
- cout << "now object three = ";
- three.ShowData();
- cout << "and object one = ";
- one.ShowData();
- cout << "four = one + two\n";
- four = one + two; // automatic move assignment
- cout << "now object four = ";
- four.ShowData();
- cout << "four = move(one)\n";
- four = std::move(one); // forced move assignment
- cout << "now object four = ";
- four.ShowData();
- cout << "and object one = ";
- one.ShowData();
- }
- std::cin.get();
- }
|