C++必知必会——读书笔记(1)

1、抽象数据类型

1.可使用类这一律念进行理解;程序员

2.须要一个可以明确表示定义的名称;编程

3.explicit : C++提供了关键字explicit,能够阻止不该该容许的通过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。设计模式

C++中, 一个参数的构造函数(或者除了第一个参数外其他参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操做符。因此, 有时候在咱们写下如 AAA = XXX, 这样的代码, 且刚好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 建立一个AAA的对象。这样看起来好象很酷, 很方便。 但在某些状况下, 却违背了咱们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用,使用, 不能做为类型转换操做符被隐含的使用。 数组

4.良好的类设计,须要对接口进行良好的定义,也就是进行框架设计,为之后使用的人制定一些规则;安全

5.设计类的原则之一:依赖倒置原则框架

A.高层次的模块不该该依赖于低层次的模块,他们都应该依赖于抽象。函数

B.抽象不该该依赖于具体实现,具体实现应该依赖于抽象。工具

2、多态

1.容许将子类类型的指针赋值给父类类型的指针。多态性在C++中是经过虚函数virtual实现的spa

2.基类须要预期以后子类可能须要的功能进行抽象设计。设计

3、设计模式

1.利于更加快速良好的设计,怎么作,作什么,为何要这么作,已经有特定的含义,更有利于交流;

2.设计模式须要具备通用性,同时通过大量验证的;

3.Bridge模式所应用的核心设计思想是针对接口编程,组合优于继承将抽象和实现相分离,使两者能够独立的变化。若是你想要写一个游戏,而且想让这个游戏同时支持PC和手机,那么怎么样的设计能够避免写两套代码,而且不影响可扩展性呢?提及来仍是比较简单的,只要把对平台的依赖部分抽取成抽象的接口(好比说绘图部分),而且针对抽取出来的接口,分别实现PC版和手机版就好了。系统的其余部分只要调用那套抽取出来的接口就能够完成全部的功能。这样来看,系统的其余部分是不依赖具体的平台的,也就具备了良好的扩展性。这个就是Bridge模式的应用。

4、STL

1. 模板定义:模板就是实现代码重用机制的一种工具,它能够实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版能够分为两类,一个是函数模版,另一个是类模版。 template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,若是类型形参多余一个 ,每一个形参前都要加class <类型 形参表>能够包含基本数据类型能够包含类类型

2.序列式容器

1向量(vector) 连续存储的元素<vector>

2列表(list) 由节点组成的双向链表,每一个结点包含着一个元素<list>

3双端队列(deque) 连续存储的指向不一样元素的指针所组成的数组<deque>

3.适配器容器

1(stack) 后进先出的值的排列 <stack>

2队列(queue) 先进先出的值的排列 <queue>

3优先队列(priority_queue) 元素的次序是由做用于所存储的值对上的某种谓词决定的的一种队列 <queue>

4.关联式容器

1集合(set) 由节点组成的红黑树,每一个节点都包含着一个元素,节点之间以某种做用于元素对的谓词排列,没有两个不一样的元素可以拥有相同的次序 <set>

2多重集合(multiset) 容许存在两个次序相等的元素的集合 <set>

3映射(map) { 键,值}对组成的集合,以某种做用于键对上的谓词排列 <map>

多重映射(multimap) 容许键对有相等的次序的映射 <map>

5、引用是别名而非指针

1. 不存在空引用,也不要强行实现空引用;

2. 全部引用必须初始化;

3. 一个引用永远指向用来对它初始化的那个对象。

6、数组形参

1. 尽可能使用容器来替代数组形参;

2. 数组形参每每会产生退化现象,此时使用须要注意边界问题;

3. 数据形参,使用模板实现更有利于扩展。

7、常量指针和指针常量

1. const A * a 指针常量,指向常量的指针;

2. A * const a 常量指针,指向变量的常指针。

3.  * 开始向后查找,若是紧挨着的是const则为常指针,不然是指针;

4. 能够将很是指针转换为常指针,最好不要将常指针转换成很是指针。

8、指向指针的指针

1. 多级指针并不经常使用,若是要使用,最好隐藏起来,减小复杂度;

2. 多级指针经常使用在函数的参数传递中,C++经常使用指针的引用来代替指针的指针;

3. 适用于指针的转换并不彻底适用于多级指针。

9、新式转型操做符

1. 旧式:使用类型强制转换;

2. 新式:

1)const_cast:去除类型修饰符const

2)static_cast:经常使用于向下转型,也能够用于基本数据类型转换;

3)reinterpret_cast:能够转换不一样类型的数据,属于强制类型转换;

4)dynamic_cast:安全的向下转型(需具备多态关系),会进行运行期检查;

5)qobject_castQt中类型的相互之间转换,必须都是继承自QObject的。