设为首页 加入收藏

TOP

泛型和面向对象C++(二)
2015-11-21 00:58:31 来源: 作者: 【 】 浏览:4
Tags:面向 对象
类中定义一个参数为基类对象的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.模板函数是函数模板的一个实例。

?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ 嵌入汇编程序提高计算效率 下一篇[LeetCode] Majority Element II

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: