C++ templates的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map.然而当愈多人用上templates,他们发现templates有能力完成愈多可能的变化.容器当然很好,但泛型编程——写出的代码和其所处理的对象类型彼此独立——更好.STL算法如for_each, find 和 merge 就是这一类编程的成果.最终人们发现,C++ template机制自身是一部完整的图灵机:它可以被用来计算任何可计算的值.于是导出了模板元编程,创造出“在C++编译器…
条款41:了解隐式接口和编译器多态 以public继承的类,…
一.让自己习惯C++ 条款01:视C++为一个语言联邦 C++可视为: C:以C为基础. 面向对象的C++:添加面向对象特性. 模板C++:泛型编程概念,使用模板. STL:使用STL的容器.迭代器.算法.及函数对象. 四者的集合. 条款02:尽量以const,enum,inline替换#define 对于单纯常量,尽量以const对象或enums枚举来代替#define. 若用 define 的可能会导致程序出出现多份目标码,而常量不会出现这种情况 取一enum的地址就不合法,这种行为和 de…
模板元编程:在c++编译器内执行并于编译完成时停止执行 1.了解隐式接口和编译期多态 面向对象编程总是以显式接口(由函数名称.参数类型和返回类型构成)和运行期多态(虚函数)解决问题 模板及泛型编程:对template参数而言,接口是隐式的,基于有效表达式的约束,而多态则是通过模板实例化和函数重载解析发生于编译期. 隐式接口和显式接口两者都在编译期完成检查. 隐式接口: template<typename T> void doProcessing(T &w) { // 隐式接口,对模板参…
条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个derived class对象也都是一个base class对象. 条款33 避免遮掩继承而来的名称 记住: ★derived classes内的名称会遮掩base classes内的名称.在public继承下从来无人希望如此 ★为了让被遮掩的名称再见天日,可使用using声明式或转交函数 ---------…
条款32:确定你的public继承塑模出is-a关系 public继承意味着is-a.适用于base class身上的每一个函数也一定适用于derived class. 条款33:避免遮掩继承而来的名称 几层作用域: global作用域 namespace作用域 Base class作用域 Drive class作用域 成员函数 控制块作用域 当前作用域会遮掩上一层作用域的名称(重载的函数也会直接遮掩) class Base{ public: void f1(); } class Drive :…
<C++ Primer 4th>读书笔记 所谓泛型编程就是以独立于任何特定类型的方式编写代码.泛型编程与面向对象编程一样,都依赖于某种形式的多态性. 面向对象编程中的多态性在运行时应用于存在继承关系的类.我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异. 在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译时不相关的类型.一个类或一个函数可以用来操纵多种类型的对象. 面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性. 模板是泛型…
模板与泛型编程 --模板定义[续] 四.模板类型形參 类型形參由keywordclass或 typename后接说明符构成.在模板形參表中,这两个keyword具有同样的含义,都指出后面所接的名字表示一个类型. 模板类型形參可作为类型说明符在模板中的不论什么地方,与内置类型说明符或类类型说明符的使用方式全然同样.详细而言,它能够用于指定返回类型或函数形參类型,以及在函数体中用于变量声明或强制类型转换. template <class T> T calc(const T &a,const…
模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一些情况下,能够利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数. compare函数和 Queue类都是这一问题的好样例:与C风格字符串一起使用进,它们都不能正确工作. compare函数模板: template <typename Type> int compare(cons…
模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实际模板类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化. 1.类的实例化 当编写Queue<int>qi时,编译器自己主动创建名为Queue<int>的类.实际上,编译器通过又一次编写Queue模板,用类型int取代模板形參的每次出现而创建Queue<int…