**侯捷老师的C++笔记2**
p7. 三大函数: 拷贝构造, 拷贝赋值(=), 析构
1 | class String |
- 拷贝构造函数:
1 | inline |
拷贝赋值
- 直接=: 浅拷贝, 指针指向同一个
- copy assignment operator,必须要进行自我检测
1
2
3
4
5
6
7
8
9inline
String& String::operator = (const String& str)
{
if (this == &str) return *this; // self assignment check, 检测指针
delete[] m_data;
m_data = new char[strlen (str) + 1];
strcpy (m_data, str.m_data);
return *this;
}
output: << 重载
1
2
3
4
5
6
ostream& operator << (ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
p8. 堆栈与内存管理
Stack
: a memory space existing in a scope, 调用函数时存放参数以及返回地址。包括在函数中声明的local
变量。- 作用域结束后自动被清理 (析构函数)
- 注: 如果是
static
,在生命结束后还是存在, 直到程序结束。
Heap
: system heap, dynamic allocates some blocks. (new) – 记得delete1
2
3
4
5{
Complex* p = new Complex(1, 2);
...
delete p; // **
}- new: 先分配memory, 再调用ctor
eg.Complex* pc = new Complex(1, 2);
1
2
3
4Complex *pc;
1. void* mem = operator new(sizeof(Complex)); \\ malloc(n) (8 bytes, 2 double)
2. pc = static_cast<Complex*>(mem); \\ 转型
3. pc->Complex::Complex(1, 2); \\ Complex::Complex(pc, 1, 2); - delete: 先调用dtor, 再释放内存
1
2
3
4
5String::~String(ps); // 释放动态分配的内存 (m_data)
operator delete(ps); // 释放内存, free()
String* p = new String[3];
delete [] p; //唤起3此dtor***, 对于指针类型的类,
// 如果是complex,可以直接delete,但最好还是delete [].
- new: 先分配memory, 再调用ctor