类中定义一个参数为基类对象的operator=,与派生类中赋值操作符不符合。因此,将类的赋值操作符定义为虚函数会令人混淆,而且不会有什么用处。
44.如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身定义类型的版本。
45.在继承情况下,派生类的作用域嵌套在基类作用域中。
46.对象、引用或指针的静态类型决定了对象能够完成的行为。甚至当静态类型和动态类型可能不同的时候,就像使用基类类型的引用或指针时可能发生的,静态类型仍然决定着可以使用什么成员。
47.在派生类作用域中派生类成员函数将屏蔽基类成员。即使函数原型不同,基类成员也会被屏蔽。
48.如果派生类想通过自身类型使用所有重载版本,则派生类必须要么重定义所有重载版本,要么一个也不重定义。若不想重定义所有,可以为重载成员提供using声明。一个using声明只能指定一个名字,不能指定形参表,因此可以将该函数的所有重载实例加到派生类的作用域。
49.虚函数必须在基类和派生类中拥有同一原型。
50.C++ primer P501。派生类的同名函数可能会将基类的虚函数屏蔽,进而无法通过派生类对象调用,可以通过指向派生类对象的基类引用或指针调用。
51.因为派生类对象在赋值给基类对象时会被“切掉”,所以容器与通过继承相关的类型不能很好地融合。
52.面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性。
53.用作模板形参的名字不能在模板内部重用,这一限制还意味着模板形参的名字只能在同一模板形参中使用一次。
54.在模板成员名前加上关键字typename作为前缀,可以告诉编译器将成员当作类型。
55.数组形参可以声明为数组的引用。如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况去,数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。
56.显式模板实参从左至右与对应模板形参相匹配。
57.当编译器看到模板定义的时候,它不立即产生代码。只有在看到用到模板时,如调用了函数模板或调用了类模板的对象的时候,编译器才产生特定类型的模板实例。
58.在包含编译模型中,编译器必须看到用到的所有模板的定义。
59.非类型模板实参必须是编译时常量表达式。
60.特化和部分特化可以具有与通用类模板完全不同的成员集合。
61.函数模板可以重载:可以定义有相同名字但形参数目或类型不同的多个函数模板,也可以定义与函数模板有相同名字的普通非模板函数。
62.异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。
63.抛出指针通常是个坏主意:抛出指针要求在对应处理代码存在的任意地方存在所指向的对象。
64.栈展开期间,释放局部对象所用的内存并运行类类型局部对象的析构函数。
65.在为某个异常进行栈展开的时候,析构函数如果又抛出自己的未经处理的另一个异常,将会导致调用标准库terminate函数。一般而言,terminate函数将调用abort函数,强制从整个程序非正常退出。
66.与析构函数不同,构造函数内部所做的事情经常会抛出异常,因此要保证适当地撤销已构造的成员。
67.如果找不到匹配的catch,程序就调用库函数terminate。
68.catch捕获的类型必须是已定义的,类型的前向声明不行。
69.通常,如果catch字句处理因继承而相关的类型的异常,它就应该将自己的形参定义为引用。
70.如果catch(...)与其他catch子句结合使用,它必须是最后一个,否则,任何跟在它后面的catch子句都将不能被匹配。
71.构造函数要处理来自构造函数初始化式的异常,唯一的方法是将构造函数编写为函数测试块。
72.异常安全指即使发生异常程序也能正常操作,即被分配的任何资源都适当地释放。通过定义一个类来封装资源的分配和释放,可以保证释放资源。这一技术常称为“资源分配即初始化”,简称RAII。应该设计资源管理类,以便构造函数分配资源而析构函数释放资源。
73.autoi_ptr只能用于管理从new返回的一个对象,它不能管理动态分配的数组。当auto_ptr被复制或赋值的时候,有不寻常的行为,因此,不能将auto_ptr存储在标准库容器类型中。auto_ptr的复制和赋值改变右操作数,因此,赋值的左右操作数必须都是可修改的左值。
74.应该只用get询问auto_ptr对象或者使用返回的指针值,不能用get作为创建其他auto_ptr对象的实参。
75.auto_ptr对象与内置指针的另一个区别是,不能直接将一个地址9或者其他指针)赋给auto_ptr对象
76.auto_ptr缺陷:

77.如果一个函数声明没有指定异常说明,则该函数可以抛出任意类型的异常。
78.在编译的时候,编译器不能也不会试图验证异常说明。如果函数抛出了没有在其异常说明中列出的异常,就调用标准库函数unexpected。默认情况下,unexpected函数调用terminate函数,terminate函数一般会终止程序。
79.因为不能再编译时检查异常说明,异常说明的应用通常是有限的。异常说明有用的一种重要情况是,如果函数可以保证不会抛出任何异常,对函数的用户和编译器都有所帮助。
80.派生类虚函数异常说明必须与对应基类虚函数的异常说明同样严格,或者比后者更受限。这个限制保证,当使用指向基类类型的指针调用派生类虚函数的时候,派生类异常说明不会增加新的可抛出异常。
81.在用另一指针初始化带异常说明的函数的指针,或者将后者赋值给函数地址的时候,两个指针的异常说明不必相同,但是,源指针的异常说明必须至少与目标指针的一样严格。
82.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。命名空间作用域不能以分号结束。
83.命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。
84.未命名的命名空间与其他命名空间不同,未命名的命名空间的定义局部于特定文件,从不跨越多个文本文件。在命名空间引入C++之前,采用static声明局部于文件的名字。
85.如果头文件定义了未命名的命名空间,那么,在每个包含该头文件的文件中,该命名空间中的名字将定义不同的局部实体。
86.接受类类型形参(或类类型指针及引用形参)的函数(包括重载操作符),以及与类本身定义在同一命名空间中函数(包括重载操作符),在用类类型对象(或类类型的引用及指针)作为实参的时候是可见的。
87.为了提供命名空间中所定义模板的自己的特化,必须保证在包含原始模板定义的命名空间中定义特化。
88.在虚派生中,由最底层派生类的构造函数初始化虚基类。无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类。
89.sort排序默认使用less,为递增排序。
90.模板函数是函数模板的一个实例。
?