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

来源:互联网 发布:淘宝消费贷款怎么申请 编辑:程序博客网 时间:2024/05/29 08:08

一、抽象数据类型

1.可以使用类这一概念进行理解;

2.需要一个能够明确表示定义的名称;

3.explicit : C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

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

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

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

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

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

二、多态

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

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

三、设计模式

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

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

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

四、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>

五、引用是别名而非指针

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

2. 所有引用必须初始化;

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

六、数组形参

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

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

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

七、常量指针和指针常量

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

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

3.  * 开始向后查找,如果紧挨着的是const则为常指针,否则是指针;

4. 可以将非常指针转换为常指针,最好不要将常指针转换成非常指针。

八、指向指针的指针

1. 多级指针并不常用,如果要使用,最好隐藏起来,减少复杂度;

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

3. 适用于指针的转换并不完全适用于多级指针。

九、新式转型操作符

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

2. 新式:

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

2)static_cast:常用于向下转型,也可以用于基本数据类型转换;

3)reinterpret_cast:可以转换不同类型的数据,属于强制类型转换;

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

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

原创粉丝点击