《C++ Primer Plus》(第六版)笔记

来源:互联网 发布:vs2010c 数据库教程 编辑:程序博客网 时间:2024/06/07 05:06

《C++ Primer Plus》(第六版)笔记

1 什么时候应调用析构函数呢?

这由编译器决定,通常不应在代码中显式的调用析构函数(有例外)。
如果创建的是静态储存类对象,则其析构函数将在程序结束时自动被调用。如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时(该对象在其中定义的)自动被调用。如果对象是通过new创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,其析构函数将自动被调用。最后程序可以创建临时对象来完成特定的操作,在这种情况下,程序将在结束对该对象的使用时自动调用其析构函数。

2 三种链接性

外部链接性(可在其他文件中访问)
内部链接性(只能在当前文件中访问)
无链接性(只能在当前函数或代码块中访问)
创建链接性为外部的静态持续变量,必须在代码块的外面声明它;
创建链接性为内部的静态持续变量,必须在代码块的外面声明它,并使用static限定符;
要创建没有链接性的静态持续变量,必须在代码块内声明它,并使用static限定符。

3 单定义规则

一方面,在每个使用外部变量的文件中,都必须声明它;另一方面,C++有“单定义规则”(One Definition Rule,ODR),该规则指出,变量只能有一次定义。为满足这种需求,C++提供了两种变量声明。一种是定义声明(defining declaration)或简称定义(definition),它给变量分配存储空间;另一种是引用声明(referencing declaration)或简称声明(declaration),它不给变量分配存储空间,因为它引用已有变量。
引用声明使用关键字extern,且不进行初始化,否则,声明为定义,导致分配存储空间:

    double up;  //definition ,up is 0    extern int blem;// blem defined elsewhere    extern char gr='Z';//definition because initializ

单定义规则并不意味着不能有多个变量的名称相同。然而虽然程序中可包含多个同名的变量,但每个变量都只有一个定义。

//file01.cpp    extern int cats=20;//definition because of initialzation    int dogs=22;//also a definition    int fleas;//also a definition
//file02.cpp//use cats and dogs from file01.cpp    extern int cats;//not definitions because of they use    extern int dogs;//extern and have no initialization 
//file03.cpp//use cats,dogs,and fleas from file01.cpp    extern int cats;    extern int dogs;    extern int fleas;

上面file02中没有重新声明变量fleas,因此无法访问它,在file01中,关键字extern并非必不可少,因为即使省略它,效果也相同。

再谈const

在C++(但不是C语言中),const限定符,对默认存储类型稍有影响。在默认情况下全局变量的链接性为外部的,但const全局变量的链接性为内部的.
因为这让程序员更加轻松。例如一组常量放在头文件中,并在同一个程序 的多个文件中使用该头文件。那么预处理器将头文件的内容包含到源文件后,所有源文件都将包含类似下面这样的定义:

const int finger=10;const char* warning="walk!";

如果全局const的链接性是外部,则根据单定义规则,这将出错。也就是说,只能有一个文件可以包含前面的声明,而其他文件必须使用extern关键字来提供引用声明。另外,只有未使用extern关键字的声明才能进行初始化:

//extern would be required if const had external linkageextern const int fingers;//can not be initializedextern const char* warning;

因此,需要为某个文件使用一组定义,而其他文件使用另一组声明。然而,如果链接性为内部的,则可以在所有文件中使用相同的声明。

如果处于某种原因,希望某个常量链接性为外部的,则可以使用extern关键字如:

extern const int states=50;//definition with external linkage

在种情况下,必须在所有使用该常量的文件中使用extern关键字来声明它。然而,鉴于单个const在多个文件之间共享,因此只有一个文件可对其进行初始化。
在函数或代码块中声明const时,其作用域为代码块,即仅当程序执行该代码块中的代码时,该常量才是可用的。

原创粉丝点击