標籤:include out ios end std pre opera 賦值 ptr
c++ 類的預設八種函數
1 #include <iostream> 2 #include <assert.h> 3 4 class MyClass 5 { 6 public: 7 MyClass(const char * str = nullptr); // 預設帶參建構函式 8 ~MyClass(void); // 預設解構函式 9 MyClass(const MyClass &); // 預設拷貝建構函式 10 MyClass & operator =(const MyClass &); // 預設重載賦值運算子函數 11 MyClass * operator &(); // 預設重載取址運算子函數 12 MyClass const * operator &() const; // 預設重載取址運算子const函數 13 MyClass(MyClass &&); // 預設移動建構函式 14 MyClass & operator =(MyClass &&); // 預設重載移動賦值操作符函數 15 16 private: 17 char *m_pData; 18 }; 19 20 // 預設帶參建構函式 21 MyClass::MyClass(const char * str) 22 { 23 if (!str) 24 { 25 m_pData = nullptr; 26 } 27 else 28 { 29 this->m_pData = new char[strlen(str) + 1]; 30 strcpy(this->m_pData, str); 31 } 32 std::cout << "預設帶參建構函式" << std::endl; 33 } 34 35 // 預設解構函式 36 MyClass::~MyClass(void) 37 { 38 if (this->m_pData) 39 { 40 delete[] this->m_pData; 41 this->m_pData = nullptr; 42 } 43 std::cout << "預設解構函式" << std::endl; 44 } 45 46 // 預設拷貝建構函式 47 MyClass::MyClass(const MyClass &m) 48 { 49 if (!m.m_pData) 50 { 51 this->m_pData = nullptr; 52 } 53 else 54 { 55 this->m_pData = new char[strlen(m.m_pData) + 1]; 56 strcpy(this->m_pData, m.m_pData); 57 } 58 std::cout << "預設拷貝建構函式" << std::endl; 59 } 60 61 // 預設重載賦值運算子函數 62 MyClass & MyClass::operator =(const MyClass &m) 63 { 64 if (this != &m) 65 { 66 delete[] this->m_pData; 67 if (!m.m_pData) 68 { 69 this->m_pData = nullptr; 70 } 71 else 72 { 73 this->m_pData = new char[strlen(m.m_pData) + 1]; 74 strcpy(this->m_pData, m.m_pData); 75 } 76 } 77 std::cout << "預設重載賦值運算子函數" << std::endl; 78 return *this; 79 } 80 81 // 預設重載取址運算子函數 82 MyClass * MyClass::operator &() 83 { 84 std::cout << "預設重載取址運算子函數" << std::endl; 85 return this; 86 } 87 88 // 預設重載取址運算子const函數 89 MyClass const * MyClass::operator &() const 90 { 91 std::cout << "預設重載取址運算子const函數" << std::endl; 92 return this; 93 } 94 95 // 預設移動建構函式 96 MyClass::MyClass(MyClass && m): 97 m_pData(std::move(m.m_pData)) 98 { 99 std::cout << "預設重載取址運算子const函數" << std::endl;100 m.m_pData = nullptr;101 }102 103 // 預設重載移動賦值操作符函數104 MyClass & MyClass::operator =(MyClass && m)105 {106 assert(this != &m);107 108 this->m_pData = nullptr;109 this->m_pData = std::move(m.m_pData);110 m.m_pData = nullptr;111 112 std::cout << "預設重載移動賦值操作符函數" << std::endl;113 return *this;114 }
c++ 類的預設八種函數