Boolan C++微专业课程第二周笔记

8.7

如果一个类带有指针,那么类的拷贝构造和拷贝赋值一定要自己写,不能用编译器的默认版本,若使用默认版本进行拷贝,则拷贝后的指针指向被拷贝指针指向的空间,而不再指向自己原来指向的空间。

字符串类的数据成员设计为字符指针,在需要内存的时候才创建一个空间来放字符本身,可以取得动态分配字符串大小的效果。

拷贝构造,构造函数的参数是同一类型的东西,举例:

String(const String& str);

拷贝赋值举例:

String& operator = (const String& str);

在拷贝赋值时,要先检测是否为自我赋值,效率高,而且不检测的话,后面的代码清除左边对象指针所指空间时,会把右边对象指针所指空间也清除了(两者实际指向同一空间),后续代码会产生不确定的行为:

if( this == &str)

return *this;

当类对象死亡的时候会调用析构函数,将动态分配的内存空间释放。析构函数举例:

Inline

String :: ~String()

{

delete [] m_data;

}

9.8

cout可以直接接字符指针,打印出指针所指字符串。

Stack(栈),是存在于某作用域(局部)的一块内存空间。例如调用函数时,函数本身即会形成一个stack来放置它所接收的参数,以及返回地址和局部对象。在函数本体内声明的任何变量所使用的内存块都取自栈。栈对象会在作用域结束之际被析构函数自动清理。

Heap(堆),是指由操作系统提供的一块全局内存空间,程序可动态分配若干区块(new)。new出来的动态空间需要手动delete掉。array new要搭配array delete,即delete[],可调用多次析构函数。

静态对象的生命在作用域结束之后仍然存在,直到整个程序结束,举例:

{

static Complex c2(1,2);

}

在全局作用域中声明的对象也是全局对象,其生命在整个程序结束之后才结束。

{

Complex* p = new Complex;

...

delete p;

}

P所指的便是heap object,其生命在它被delete之际结束。

{

Complex* p = new Complex;

}

以上会出现内存泄露(memory leak),因为当作用域结束,p所指的heap object仍然存在,但指针p的生命却结束了,作用域之外再也看不到p(也就没机会delete p)

VC下分配的动态内存块大小一定是16的倍数(字节数)。

在类成员前面加关键字static,则成为静态成员。静态数据成员只有一份,为同一类的所有对象共有。静态成员函数没有this指针,只能存取静态数据。

静态数据要在类之外定义,举例:

class Account

{

public:

static double m_rate; //声明

static void set_rate (const double& x) {m_rate=x};

}

double Account::m_rate=8.0 //定义

调用静态函数的方式:

[if !supportLists](1)[endif]通过对象调用;

[if !supportLists](2)[endif]通过类名调用,如:Account::set_rate(5.0)

使用命名空间可以避免自己写的东西和别人写的东西重名引起的冲突。

namespace std //名字自己取

{

...

}

你可能感兴趣的:(Boolan C++微专业课程第二周笔记)