Created
March 18, 2021 07:57
-
-
Save ffosilva/25506808096803c802da5ec13eac43c2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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