C++面向对象高级编程_侯捷(上2) class with pointer
7 三大函数:拷贝构造、拷贝复制、析构
7.1 C++两个经典分类
- Class without pointer member(s)
complex - Class with pointer member(s)
string
7.2 String class
string.h
#ifndef __STRING__
#define __STRING__
class String
{
...
}
String::function(...) ...
Global-function(...) ...
#endif
string-test.cpp
int main()
{
String s1();
String s2("hello");
String s3(s1); // 拷贝构造
cout << s3 << endl;
s3 = s2; // 拷贝赋值
cout << s3 << endl;
}
如果类里面有指针成员变量,拷贝构造函数需要自己写。否则按照编译器默认的拷贝构造函数,会造成两个对象的指针成员变量指向同一块地址。
7.3 Big Three,三个特殊函数 1 2 3
class String
{
public:
String(const char* cstr = 0); // 0 默认构造函数
String(const String& str); // 1 拷贝构造函数
String& operator=(const String& str); // 2 拷贝赋值函数
~String(); // 3 析构函数
char* get_c_str() const { return m_data; }
private:
char* m_data;
}
拷贝构造函数
拷贝复制函数
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;
}
析构函数
堆,栈与内存管理
stack,栈是存在于某作用域的一块内存空间。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址,以及local object。
在函数本体内声明的任何变量,其所使用的内存块都取自上述stack。
Heap,或称system heap,堆是指由操作系统提供的一块global内存空间,程序可动态分配从某中获得的若干区块。
stack objects的生命期
stack object的生命在作用域结束之际结束。
这种作用域内的object,又称为auto object,因为它会被自动清理。
static local objects的生命期
static object的生命在作用域结束之际仍然存在,直到整个程序结束。
global objects的生命期
在整个程序结束之际才结束。
heap objects的生命期
在被delete之际结束。不delete堆对象,会造成内存泄漏(指针已经死亡,但指向的空间还在)。
new:先分配memory,再调用ctor(constructor)
Complex* pc = new Complex(1,2);
delete:先调用dtor,再释放memory
delete ps
动态分配所得的内存块(memory block),in VC
动态分配所得的array
new typename[] 一定要搭配 delete[]
尤其是class with pointer members,不使用delete[],会造成内存泄漏,因为只调用了一次析构函数。
看到第9节