这周课程主要讲解了Big Three的用途写法和注意事项以及内存管理。
当没有手动编写三大函数时,编译器会使用默认的一套,operator=的默认会依次复制。如果是基本数据类型自然没什么问题,但当数据成员含有指针的时候,operator的只会进行浅复制,即只是指针本身被复制,而不是指针所指向的内容被复制。为了进行深复制,需要我们单独编写。
即 class with point members 必须有 copy ctor 和 copy op= 和析构函数。
1.析构函数
~String();
inline String::~String() { delete[ ] m_data; }
当一个对象超出作用域 或执行delete的时候,析构函数就被调用。
2.复制构造函数
inline String::String(const String& str)
{
m_data = new char[ strlen(str.m_data) + 1 ]; //分配空间
strcpy(m_data, str.m_data); //复制内容
}
3.operate=
inline String& String::operator=(const String& str)
{
if (this == &str) // 检测自我复制
return *this;
delete[] m_data; //删除左侧空间
m_data = new char[ strlen(str.m_data) + 1 ]; //创建和右侧相同大小的空间
strcpy(m_data, str.m_data); //复制右侧内容到左侧
return *this;
}
关于内存管理:
栈一般优于堆。
array new一定要搭配 array delete。
由于算是半个初学者,并不能提出什么自己的理解,会努力学习研读前辈们的著作和代码。