随记:面向对象接口设计原则及智能指针原理(引用指数)

一、设计原则

1、单一职责原则

类的职责单一,对外只提供一种功能,而引起类变
化的原因都应该只有一个。

2、开闭原则

类的改动是通过增加代码进行的,而不是修改源代
码。

3、里氏代换原则

任何抽象类出现的地方都可以用他的实现类进行替
换,实际就是虚拟机制,语言级别实现面向对象功
能。

4、依赖倒转原则

依赖于抽象(接口),不要依赖具体的实现(类),也就
是针对接口编程。

5、接口隔离原则

不应该强迫用户的程序依赖他们不需要的接口方
法。一个接口应该只提供一种对外功能,不应该把
所有操作都封装到一个接口中去。

6、合成复用原则

如果使用继承,会导致父类的任何变换都可能影响
到子类的行为。如果使用对象组合,就降低了这种
依赖关系。对于继承和组合,优先使用组合。

7、迪米特法则

一个对象应当对其他对象尽可能少的了解,从而降
低各个对象之间的耦合,提高系统的可维护性。例
如在一个程序中,各个模块之间相互调用时,通常
会提供一个统一的接口来实现。这样其他模块不需
要了解另外一个模块的内部实现细节,这样当一个
模块内部的实现发生改变时,不会影响其他模块的
使用。(黑盒原理)

二、智能指针原理

1 智能指针的作用

智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源

2 智能指针的种类

shared_ptr、unique_ptr、weak_ptr、auto_ptr

2.1 shared_ptr

实现原理:采用引用计数器的方法,允许多个智能指针指向同一个对象,每当多一个指针指向该对象时,指向该对象的所有智能指针内部的引用计数加1,每当减少一个智能指针指向对象时,引用计数会减1,当计数为0的时候会自动的释放动态分配的资源。

    1) 智能指针将一个计数器与类指向的对象相关联,引用计数器跟踪共有多少个类对象共享同一指针;

     2) 每次创建类的新对象时,初始化指针并将引用计数置为1;

     3) 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;

     4) 对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;

     5) 调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

2.2 unique_ptr

unique_ptr采用的是独享所有权语义,一个非空的unique_ptr总是拥有它所指向的资源。转移一个unique_ptr将会把所有权全部从源指针转移给目标指针,源指针被置空;所以unique_ptr不支持普通的拷贝和赋值操作,不能用在STL标准容器中;局部变量的返回值除外(因为编译器知道要返回的对象将要被销毁);如果你拷贝一个unique_ptr,那么拷贝结束后,这两个unique_ptr都会指向相同的资源,造成在结束时对同一内存指针多次释放而导致程序崩溃。

2.3 weak_ptr

weak_ptr:弱引用。 引用计数有一个问题就是互相引用形成环(环形引用),这样两个指针指向的内存都无法释放。需要使用weak_ptr打破环形引用。weak_ptr是一个弱引用,它是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是说,它只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前使用函数lock()检查weak_ptr是否为空指针。

2.4 auto_ptr

auto_ptr不支持拷贝和赋值操作,不能用在STL标准容器中。STL容器中的元素经常要支持拷贝、赋值操作,在这过程中auto_ptr会传递所有权,auto_ptr采用的是独享所有权语义,一个非空的unique_ptr总是拥有它所指向的资源。转移一个auto_ptr将会把所有权全部从源指针转移给目标指针,源指针被置空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值