侯捷C++个人学习笔记Part1第三部分扩展补充(结束)

Part1前两部分的补充说明

进一步补充:static
在这里插入图片描述
创建对象的时候会讲非static对象即非静态对象都创建一遍
如上图调用c1.real的时候实际上调用代码为complex::real(&c1),c1的地址作为指针传进去即thispoint,成员函数都有隐藏的指针为thispoint指向调用此成员函数的对象。

加上static之后,静态数据和静态函数就脱离对象了成为附属于类的数据和对象,相当于一个银行有一百万个用户却只有一个利率,利率就等同于银行的静态数据。
静态成员函数没有thispoint,只能取存取静态的数据
在这里插入图片描述
如果是静态的数据,一定要在class的外面对静态数据进行定义(初始化)

当使用对象调用静态函数的时候不会传入本身的地址

把构造函数放在private里

在这里插入图片描述
如果只希望产生一个对象,如上图,两个构造函数都放在private中
getInstance是对外界的唯一的接口,只能通过getInstance得到唯一的对象
这个写法并不完美,如果a没有用到就很浪费
在这里插入图片描述
getInstance()仍然是对外的唯一窗口
但唯一的对象放在getInstance里,写出这样那么如果没有人使用那么a就不存在。只有当人调用getInstance(),a才会被创建。

进一步补充:cout
在这里插入图片描述
cout的类型继承自ostream,可以说cout就是一种ostream

进一步补充:class template ,类模板
在这里插入图片描述
typename可以用T来替代
类模板必须要明确指出替代的typename是什么
如上图所示调用,c1传入的类型会把T全部替换为double,c2传入的类型会把T全部替换成int

进一步补充:function template,函数模板
在这里插入图片描述
class类型也可以用T来代替
函数模板不必明确指出class类型是什么,编译器会做实参推导
因为比大小都使用(<)符号,设计比大小的方法不在<身上,而是在参与比大小的对象的class里

进一步补充:namespace
在这里插入图片描述
namespace 后可以命名一个名称将所有东西都放到名称里,这样就讲有所得东西都包装到命名空间里。
using directive等于将std全部打开,把所有东西都取出来
using declaration相当于从std中拿一个东西
更多细节与深入
在这里插入图片描述
operator 加一个typename,举个例子3/5转换成0.6

学海无穷,进一步有一步的欢喜

组合与继承

Inheritance(继承)
Composition(复合)
Delegation(委托)

函数关系之复合Composition

在这里插入图片描述
在这里插入图片描述
queue中有一个deque,我里面有另一个(或n个)东西,我和另一个东西的关系就叫复合
黑色的菱形表示有其他东西,黑色菱形这一端就是容器

上图函数queue完全调用deque的函数,可能deque包含100个功能但只调用6个,这种设计模式Adapter
上图中的queue就叫Adapter
在这里插入图片描述

复合关系下的构造和析构

在这里插入图片描述
构造是先调用内部的构造函数再去做自己的,红色部分为内部构造(红色部分是默认构造函数),后面的大括号是container的构造函数
析构函数是先析构自己再进入container内部调用component的析构函数

函数关系之委托Delegation(Composition by reference)

在这里插入图片描述
空心菱形表示指针,仍然表示左边拥有右边。
“我”拥有一个指向你的指针,我就可以在需要的时候调用你。复合也可以实现同样的作用,所以委托Delegation也被称为Composition by reference。
在学术界不讲by point 只讲by reference不用做过多区分
委托与复合不同在于,复合式需要有部分才能有整体。委托可以先拥有整体,等到需要的时候才去创建右边的类(被委托的类)
左Handele委托关系相当于左边(委托的类)给一个对外的接口,右Body右边(被委托的类)来规定如何实现左边所有功能

虚线圆圈内表示的就是被委托对象的东西,如果创建一个String对象a(Hello),b和c都是拷贝a对象来的于是它们指向同一个东西,此时n为3。a,b,c互不知道,如果a需要改变自己的内容,则a会拷贝自己的内容来写(copy for write)

函数关系之继承Inheritance

在这里插入图片描述
黄色部分标注的就是继承的类。继承的关系图由子类往父类画即子类指向父类。
C++中有public,private和protected继承三种,Java只有public继承所以可以忽略public不写但C++不行
public继承表示的就是is-a关系(人是一个动物)
子类中不仅有自己的东西还有父亲的东西

继承关系下的构造和析构

在这里插入图片描述
继承关系的表示的是子类对象中有父类的成分
继承关系的子类构造函数执行也是由内而外,析构函数也是由外而内
父类的析构函数必须是virtual否则不会有由外而内

继承关系下的virtual(虚函数)

derive class子类
pure纯净的
在这里插入图片描述
只要在任何成员函数之前加上virtual那么它就是虚函数
纯虚函数(pure virtual):没有定义,一定要被所有的子类重新定义
虚函数:如果子类有更好的想法我允许你重新定义此函数

虚函数和多态

在这里插入图片描述
只有开启文件后读的内容不同,除此之外上图所有动作都采用相同动作完成

Template Method设计模式(23设计模式之一)
在这里插入图片描述
通过子类的函数调用父类的函数,调用过程如灰线所示。
当子类调用父类函数发现子类已经重写相关函数,就会先去子类执行相关函数然后返回执行父类剩余函数
一般性的动作一般由父类先写好留下无法决定的函数成为虚函数。

myDoc作为隐藏的this point 传入OnFileOpen,

在这里插入图片描述
19写的很清楚,子类一定要重写此函数

继承+复合下的构造和析构

在这里插入图片描述
Component可能有100个方法但容器可能只调用几个方法
第一种情况下
先父类再复合类最后子类
在这里插入图片描述
第二种情况下
先复合类再父类最后子类
在这里插入图片描述

委托+继承(功能最强大)

需要解决的问题
一份文件可以同时在多个窗口观察,如果其中一个窗口发生变化则所有窗口变化
在这里插入图片描述
上图中左边相同的observer有四个,右边不同的observer有三个

vector容器
在容器中放指向Observer类的指针
右边的类可以被继承
在这里插入图片描述
在这里插入图片描述

想要观察subject的Observer对象都需要注册
上图的attach函数用于将指向observer类的指针放到vector容器(m_views)里头
notify函数用于通知Observer将要调用update函数,准备更新数据
Composite设计模式(23设计模式之一)
在这里插入图片描述
不能把add函数设计为纯虚函数,因为一旦设计为纯虚函数则子类都需要重写
在这里插入图片描述
波浪线上面才是我们之后所能看见的

如果想要创建未来的class对象
让每一个子类都创建出自己的原型,让每个人都能看见并拷贝。此时需要在父类中创建一个空间把所有子类原型放进去
LSAT是一个静态的对象,因为下面有下划线。“-”此符号代表private,“+”此符号代表public一般默认为public所以不写,“#”此符号代表protected。
clone()函数就是创建新的副本对象
在这里插入图片描述
clone是纯虚函数但要求子类必须写出来,static的data必须给初值,类中只是定义。
findAndClone函数用于找出克隆的子类并且返回克隆的子类
在这里插入图片描述
private中会创造静态的自己(作为展示)然后放入父类函数中进行展示
为什么子类需要两个构造函数
因为如果调用clone函数而我们只有一个构造函数,那么会创建出新的构造函数然后放到父类中进行展示,但是我们只能展示初始的无参数的对象。而且第二个构造函数不能放在公开区域因为不许外部创建,因此我们只能用protected或者private
第二个构造函数中的参数只是为了区分第一个构造函数存在的。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值