C++带有指针的类笔记-Geekband

对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将变为孤儿,从而发生内存泄漏。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容