基础知识:
c++语言关键特性
1.template(模板)
所谓templates,是针对“一个或多个尚未明确的型别”所撰写的函数或类别。使用templates时,可以而显示的(explicitly)或隐式的(implicitly)将型别当做参数来传递。
关键字 typename
用于作为型别之前的标识符号。考虑下面的例子:
template
class MyClass {
typename T::SubType * ptr;
…
};这里,typename指出SubType是class T中定义的一个型别,因此ptr是一个指向T::SubType型别的指针。如果没有关键字typename,SubType会被当成一个static成员,于是:
T::SubType * ptr;
会被解释成为型别T内的数值SubType与ptr的乘积。
注意,如果要吧一个template中的某个标识符号指定为一种型别,就算意图显而易见,但是关键字typename也不可或缺,因此C++的一般规则是,除了以typename装饰之外,template内的任何标识符号都被一个值(value)而非一个型别。Member Template(成员模板)
class member funtion 可以是个template,但是这样的member template既不能是virtual,也不能有缺省参数。
我认为这模板的使用难以用语言表达,必须用例子来说明才好。参见The C++ Standard Library中P12~13的例子。
Template constructor是member template的一种特殊形式。Template constructor 通常用于“在复制对象时实现隐式型别转换”。注意,模板构造函数与默认缺省构造函数的区别。书上指出template constructor not hide implicit copy constructor。如果型别完全吻合,implicit
copy constructor 就会被生产出来并被调用撰写template ctor时,如果default copy ctor不符合你的要求,别忘了自己提供一个copy ctor
2.基本型别的显示初始化(Explicit Initialization)
如果采用不含参数的,明确的constructor(构造函数)调用语法,基本型别会被初始化为零。
3.异常处理(Exception Handling)
通过异常处理,C++标准程序可以在不“污染”函数接口(亦即参数和返回值)的情况下处理异常。如果你遇到一个意外情况,可以通过“抛出一个异常”来停止一般(正常)处理过程。
4.命名空间(Namespace)
是用于解决越来越多软件由程序库、模块(modules)和组件拼凑而成。各种不同的事物的组合,可能导致一场名称冲突。Namespace就是用来解决这一问题的。
Namespace将不同的标识符号集合在一个具名作用域(named scope)内。