本文原创,转载请注明出处:http://blog.csdn.net/banket004
文摘和总结:
模板和泛编程
1.类模板的成员函数只有为程序使用才进行实例化.如果某函数从未使用,则不会实例化该成员函数.
2.非类型模板实参必须是编译时常量表达式.
3.当成员模板是类模板的成员时,它的定义必须包含类模板形参和自己的模板形参.首先是类模板形参表,后面接着成员自己的形参表.格式如:
Template<class T> Template<class Iter>
void Queue<T>::assign(Iter begin, Iter end)....
与其他成员一样,成员模板只有在程序使用时才进行实例化.类模板形参由调用函数的对象的类型决定,成员定义的模板形参的行为和普通函数模板一样,形参都通过"常规模板实参推断"而定.
4.模板特化.是指模板中一个或多个模板形参的实际类型或实际值是指定的.特化的形式如下:
关键字Template后面接一对空尖括号(<>);
再接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参(尖括号及其里面的内容可省略);
函数形参表;
函数体.
代码示例:
Template<class T>
int compare(const T &val1, const T &val2);
当模板形参绑定到const char* 时,compare函数特化如下:
Template<>
int compare(const char* const &val1, const char const &val2);
多继承与虚继承
1.通常每个类只初始化自己的直接基类.但在虚继承的情况下,由最低层派生类的构造函数初始化虚基类.
虽然虚基类由最低层派生类初始化,但任何任何直接或间接继承虚基类的派生类一般也必须为该虚基类提供自己的初始化式.只要可以创建虚基类派生类类型的独立对象,该类就必须初始化自己的虚基类,这些初始化式只在创建中间类型的对象使用.
2.无论虚基类出现在继承层次的任何地方,总是在构造非虚基类之前构造虚基类.
3.基类的构造次序由派生类的派生列表次序决定,派生类的构造函数初始化列表中指定的基类次序不影响构造基类的次序.
表达式
逗号操作符
逗号表达式是一组由逗号组成的表达式,这些表达式从左向右计算.如:
int a, b, c, d;
a = 1;
b = 2;
c = a, b;
d = (a, b);
c的值为1,d的值为2.在"c=a,b;"语句中,因为赋值操作符的优先级比逗号操作符高,所以是先执行"c=a".在"d=(a,b);"语句中,"(a,b)"的结果是b,所以实际上等于d=b(=2).
书中错误:
1. P513,L16-L18(513页,16-18行):
"WordQuery和NotQuery类具有系统中其他类所没有的一个性质...WordQuery和NotQuery类将继承BinaryQuery类"这个文字中的"WordQuery"和"NotQuery"应该是"AndQuery"和"OrQuery".
待续....