重新爱回C++之再入坑笔记

C++发展背景

本书笔记大部分来源于C++ Primier / Plus 系列丛书/(C98标准大量+少量C11新标准),开始书写博客前我首先向书籍和作者/译者致敬。 对C++发展史感兴趣的TX可以看这里 [here][1]. 它和C一样,诞生于贝尔实验室,由Bjarne Stroustrup 于上世纪80年代开发。其拥有的泛型编程(非固定类型)+ OOP + 保留传统过程编程风格,使其深受编程爱好者的喜爱,我也是其中之一 :)

总体来看,发展为:
Stroustrup编写的《The programming language》包含65页的参考手册,它成了最初的C++事实标准。
下一个事实标准是Ellis和Stroustrup写的《The Automated C++ Reference Manual》
C++98标准新增了大量特性,其篇幅将近800页,且包含的说明很少。
C++11标准的篇幅长达1350页,对旧标准做了大量的补充。

一些术语

SFINAE (https://www.zhihu.com/question/31064902/answer/50504133)
”Substitution failure is not an error“
ANSI (American National Standards Institute)
美国国家标准局委员会于1990年设立委员会 ANSI Z3J16, 专门负责制定C++标准,这个ANSI此前也设立了C语言标准
ISO
国际标准化组织ISO很快通过自己的委员会(ISO-WG-21)加入了ANSI行列,创建了联合组织 ANSI/ISO,致力于制定C++标准
ISO/IEC 14882:1998 这是一个国际标准,于1998年获得ISO 、IEC(International Electrotechnical Committee 国际电工技术委员会)和ANSI的批准。该标准就是我们熟知的C++98-----这个标准中添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL)
ISO/IEC 14882:2003 这个标准是2003年发布的(C++第二版):修订错误、减少多义性,但没改变语言特性。这个版本就是我们熟知的C++03. 因为他没有改变语言特性,所以也称为 C++98/C++2003
ISO/IEC 14882:2011 这个标准是C++11(也叫做c++0x).
ISO C++还吸收了 ANSI C语言标准,因为 C++是C语言的超集。这意味着理想情况下,任何有效的C程序都应该是有效的C++程序----ANSI C与对应的C++规则之间存在一些差别,但这种差别很小。
实际上, ANSI C加入了C++首次引入的一些特性,比如函数原型 和 类型限定符const

ANSI C不仅定义了C语言,还定义了一个ANSI C实现必须支持的标准C库标准库,C++也使用了这个库。
同时,ANSI/ISO C++标准还提供了一个C++标准类库

最新的C标准为C99

C++和泛型(generic)编程、模板元编程、OOP

泛型编程是C++其中一种编程模式,与OOP目标相同:代码重用,抽象通用。区别在于,泛型注重独立于特定的数据类型,OOP注重编程的数据。

OOP是一个强大的管理项目的工具,而泛型编程强调独立于特定数据类型,且提供了执行常见任务(如对数据排序或合并链表)的工具

元编程侧重点在于「用代码生成代码」,泛型编程侧重点在于「减小代码对特定数据类型的依赖」。碰巧这两件事 C++ 的模板都可以干。(https://www.zhihu.com/question/28435037
https://www.zhihu.com/question/28435037
https://www.cnblogs.com/qicosmos/p/4480460.html )

模板元(元编程)是C++的精髓,类似的好书有《C++ templates》《The C++ Programming Language》《The design and Evolution of C++》

例如,模板元编程把模板的一些技术(特化、实例化、 SFINAE )当成模板元编程这种特定语言的控制流。例如 fact<10>::value 会在计算 value 的过程中实例化 11 个 fact( i 从 0 到 10 )的空类(我猜测这属于模板特化)。实例化代码是计算手段,是递归的中间结果。而泛型编程则是将模板用特定的类型来实例化,例如将模板类 list 实例化成真正的类 list 。实例化代码是最终目的。
(例文链接:https://www.zhihu.com/question/31064902/answer/951581334, https://bbs.****.net/topics/395567483)

关于模板特化、半特化

这里是从SKYNET群小武那里转来的笔记,感兴趣可以看看。

class GameCharacter;
int defaultHealthCalc(const GameCharacter&gc);
class GameCharacter{
public:
typedef int(*HealthCalcFunc)(const GameCharacter&);
explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)
:healthFunc(hcf){
}
int healthValue() const {
return healthFunc(*this);
}
private:
HealthCalcFunc healthFunc;
};
class EvilBadGuy :public GameCharacter{
public:
explicit EvilBadGuy(HealthCalcFunc hcf = defaultHealthCalc) :GameCharacter(hcf){
}
};

同一个类的不同对象,可以在执行期使用不同的某个指定功能的函数(这里是一个改变健康值的示例),
同时可以替换虚拟函数的派生类多态的能力。

可以做到,让每个不同的实体(相同类但不同实体)都能有自己单独的功能函数。
这个就可以应用于沙盒类游戏对不同对象的派生。

重新爱回C++之再入坑笔记

这个也很经典。不过一些著名的书里都有提到这些用法。
[1]:http://www.research.att.com