对class有一种经典分类,即分为:
1.不带有指针成员的类Class without pointer member(s);如complex类
2.带有指针成员的类Class with pointer member(s);如string类
不带有指针成员的类在上一篇已经总结过,而实现一个带有指针成员的类要注意以下知识点:
1.带有指针成员的类就必须写出拷贝构造函数和拷贝赋值函数
2.拷贝构造(copy constructor),拷贝赋值(copy assignment operator),析构函数(destructor)并称为Big Three:
3.同一个class的不同的对象互为friend,因此可以直接取友元内的属性值。
String s2(s1)和Strings2 = s1的意义是完全相同的。
4.在实现拷贝赋值时,要记得先清空,然后分配指定的赋值所需空间,最后再将内容拷贝过来。
5.在实现拷贝赋值时要记得检测自我赋值,如果没有检测,一旦使用者进行自我赋值,就会报错。会出错的原因是拷贝赋值中的先清空再分配再赋值的操作,自我赋值时先清空后要赋值的内容就被删除了,再进行取值会产生未定义的行为。
附:堆(heap)和栈(stack)
Stack, 是存在于某作用域(scope)的一块内存空间(memory space)。例如当你调用函数时,函数本身即形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack。
Heap, 或谓之System heap, 是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从某种获得若干区块(blocks)。
由于动态分配的内存是由堆(heap)中取得的,因此对于这些获得的内存,我们有责任手动释放它,使用delete语句。
object可以分为stack object,global object,static object,和heap object
stack object 的生命周期,在其scope即作用域内,一旦作用域结束,它会被自动清理。
static object 被声明为静态的,将一直持续到程序运行结束。
global object 在外部全局声明,其生命周期和static一样将持续到程序运行结束。
heap object 则将在其被delete之际结束自己的生命周期,如果不delete,因为指向其的指针存在于stack中,一旦指针被清除,heap obeject将变为孤儿,从而发生内存泄漏。