#include using namespace std; class CleverPointer { public: // Constructors CleverPointer() : datapointer{ nullptr } {} CleverPointer( int const data ) : datapointer{ new int{data} } {} // Destructor ~CleverPointer() { delete datapointer; } // Move constructor and operator CleverPointer( CleverPointer && rhs ) : CleverPointer{} { std::swap( datapointer, rhs.datapointer ); } CleverPointer& operator=( CleverPointer && rhs ) { std::swap( datapointer, rhs.datapointer ); return *this; } // Copy constructor and operator CleverPointer( CleverPointer const& rhs ) : datapointer{ new int{*rhs.datapointer} } {} CleverPointer& operator=( CleverPointer const& rhs ) { CleverPointer tmp{ rhs }; std::swap( datapointer, tmp.datapointer ); return *this; } // Other methods void print( ostream& os ) const { if( datapointer ) { os << *datapointer; } } void set( int const data ) { *datapointer = data; } private: int* datapointer; }; int main() { { // copy constructor CleverPointer cp1{ 1 }; CleverPointer cp2{ cp1 }; cp2.set( 5 ); cp1.print( cout ); cout << endl; cp2.print( cout ); cout << '\n' << endl; } { // copy assignment operator CleverPointer cp1{ 1 }; CleverPointer cp2{ }; cp2 = cp1; cp2.set( 5 ); cp1.print( cout ); cout << endl; cp2.print( cout ); cout << '\n' << endl; } { // move constructor CleverPointer cp1{ 1 }; CleverPointer cp2{ move( cp1 ) }; cp2.set( 5 ); cp1.print( cout ); cout << endl; cp2.print( cout ); cout << '\n' << endl; } { // move assignment operator CleverPointer cp1{ 1 }; CleverPointer cp2{ }; cp2 = move( cp1 ); cp2.set( 5 ); cp1.print( cout ); cout << endl; cp2.print( cout ); cout << '\n' << endl; } }