从零单排c++ primer(23)

(1)在栈展开的过程中,运行类类型的局部对象的析构函数。因为这些析构函数是自动执行的,所以它们不应该抛出异常。一旦在栈展开过程中析构函数抛出了异常,并且析构函数自身没能捕获到该异常,则程序将被终止。
(2)抛出指针要求在任何对应的处理代码存在的地方,指针所指的对象都必须存在。
(3)通常情况下,如果catch接受的异常与某个继承体系有关,则最好将该catch的参数定义成引用类型。、
(4)如果在多个catch语句的类型之间存在着继承关系,则我们应该把继承链中最底端的类放在前面,而将继承链最顶端的类放在后面。
(5)空的throw语句只能出现在catch语句或catch语句直接或间接调用的函数内。
(6)一个重新抛出语句并不指定新的表达式,而是将当前的异常对象沿着调用链向上传递。
(7)如果catch(...)与其他几个catch语句一起出现,则catch(...)必须在最后的位置。出现在捕获所有异常语句后面的catch语句将永远不会被匹配。
(8)处理构造函数初始值异常的唯一方法是将构造函数写成函数try语句块。
(9)对于一个函数来说,noexcept说明要么出现在该函数的所有声明语句和定义语句中,要么一次也不出现。
(10)在typedef或类型别名中则不能出现noexcept。
(11)noexcept有两层含义:当跟在函数参数列表后面时它是异常说明符;而当作为noexcept异常说明的bool实参出现时,它是一个运算符。 
(12)如果为某个指针做了不抛出异常的声明,则该指针将只能指向不抛出异常的函数。相反,如果显式或隐式地说明指针可能抛出异常,则该指针可以指向任何函数,即使承诺了不抛出异常的函数。
(13)如果一个虚函数承诺了它不会抛出异常,则后续派生的虚函数也必须做出同样的承诺;相反如果基类的虚函数允许抛出异常,则派生类的对应函数既可以允许抛出异常,也可以不允许抛出异常。
(14)运行时错误表示的只是在程序运行时才能检测到的错误;而逻辑错误一般指的是我们可以在程序代码中发现的错误。 
(15)命名空间的定义包含两个部分:首先是关键字namespace,随后是命名空间的名字。在命名空间后面是一系列由括号括起来的声明和定义。
(16)命名空间既可以定义在全局作用域内,也可以定义在其他命名空间中,但是不能定义在函数或类的内部。
(17)命名空间作用域后面无须分号。
(18)定义多个类型不相关的命名空间应该使用单独的文件分别表示每个类型或关联类型构成集合。
(19)全局命名空间以隐式地方式声明,并且程序中都存在。
(20)和其他命名空间不同,未命名的命名空间仅在特定的文件内部有效,其作用范围不会横跨多个不同的文件。
(21)在文件中进行静态声明的做法已经被c++标准取消了,现在的做法是使用未命名的命名空间。 

你可能感兴趣的:(C++,学习,语言,VC,C++Primer)