Skip to content

Instantly share code, notes, and snippets.

@ffosilva
Created March 18, 2021 07:57
Show Gist options
  • Save ffosilva/25506808096803c802da5ec13eac43c2 to your computer and use it in GitHub Desktop.
Save ffosilva/25506808096803c802da5ec13eac43c2 to your computer and use it in GitHub Desktop.
// build using `g++ -fno-elide-constructors rule_of_five.cpp`
#include <stdlib.h>
#include <iostream>
class MyMovableClass
{
private:
int _size;
int *_data;
public:
MyMovableClass(size_t size) // constructor
{
_size = size;
_data = new int[_size];
std::cout << "CREATING instance of MyMovableClass at " << this << " allocated with size = " << _size*sizeof(int) << " bytes" << std::endl;
}
~MyMovableClass() // 1 : destructor
{
std::cout << "DELETING instance of MyMovableClass at " << this << std::endl;
delete[] _data;
}
MyMovableClass(const MyMovableClass &source) // 2 : copy constructor
{
_size = source._size;
_data = new int[_size];
*_data = *source._data;
std::cout << "COPYING content of instance " << &source << " to instance " << this << std::endl;
}
MyMovableClass &operator=(const MyMovableClass &source) // 3 : copy assignment operator
{
std::cout << "ASSIGNING content of instance " << &source << " to instance " << this << std::endl;
if (this == &source)
return *this;
delete[] _data;
_data = new int[source._size];
*_data = *source._data;
_size = source._size;
return *this;
}
MyMovableClass(MyMovableClass &&source) // 4 : move constructor
{
std::cout << "MOVING (c’tor) instance " << &source << " to instance " << this << std::endl;
_data = source._data;
_size = source._size;
source._data = nullptr;
source._size = 0;
}
MyMovableClass &operator=(MyMovableClass &&source) // 5 : move assignment operator
{
std::cout << "MOVING (assign) instance " << &source << " to instance " << this << std::endl;
if (this == &source)
return *this;
delete[] _data;
_data = source._data;
_size = source._size;
source._data = nullptr;
source._size = 0;
return *this;
}
};
void useObject(MyMovableClass obj)
{
std::cout << "using object " << &obj << std::endl;
}
int main()
{
MyMovableClass obj1(100); // constructor
useObject(obj1);
//useObject(std::move(obj1));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment