默认情况C++会自动为类生成构造函数、析构函数、复制构造函数、赋值构造函数,但是当类数据成员中有指针类型时,需要我们自己写这些默认的函数来更好的管理内存。
下面以一个字符串类为例子说明
| class MyString { public: MyString(); MyString(char* str = " "); ~MyString(); MyString(MyString&); MyString& operator=(MyString& str); friend ostream& operator<< (ostream&, const MyString &); unsigned int size() const; bool empty() const; void show(); private: char* m_Data; void copy(char*); };
|
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| MyString::MyString() {} MyString::MyString(char* str) { this->copy(str); } MyString::MyString(MyString& string) { this->copy(string.m_Data); } MyString::~MyString() { if (m_Data != nullptr) { delete[] m_Data; m_Data = nullptr; } } MyString& MyString::operator=(MyString& str) { if (this == &str) return *this; if (m_Data != nullptr) { delete[] m_Data; m_Data = nullptr; } this->copy(str.m_Data); return *this; }
unsigned int MyString::size() const { return strlen(m_Data); } bool MyString::empty() const { if (m_Data == nullptr) return true; return false; } void MyString::copy(char* str) { unsigned int len = strlen(str); m_Data = new char[len + 1]; memset(m_Data, 0, len+1); memcpy(m_Data, str, len); } ostream& operator<< (ostream& os, const MyString & str) { if (str.empty()) return os; os << str.m_Data; return os; }
|
构造函数、复制、赋值构造函数中都需要为对象重新申请内存
赋值构造函数中是将对象中m_Data保存的值赋值,而不是直接将m_Data指针赋值。先将原来的空间释放,然后申请新的空间
析构释放空间