重写class的默认函数

默认情况C++会自动为类生成构造函数、析构函数、复制构造函数、赋值构造函数,但是当类数据成员中有指针类型时,需要我们自己写这些默认的函数来更好的管理内存。

下面以一个字符串类为例子说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyString {
public:
MyString(); //构造
MyString(char* str = " "); //构造
~MyString(); //析构
MyString(MyString&); //复制
MyString& operator=(MyString& str);//赋值
friend ostream& operator<< (ostream&, const MyString &); //输出重载
unsigned int size() const; //返回char的个数
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 //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指针赋值。先将原来的空间释放,然后申请新的空间

析构释放空间


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!