您的位置:首页 > 编程语言 > C语言/C++

C++ primer(第四版)读书笔记5

2012-01-20 20:49 232 查看
定义变量也是声明。可以通过使用extern关键字声明变量名而不定义它: p46

extern int i; //declares but does not define i
int i //declares and defines i

extern声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。

如果声明有初始化式,那么它可被当做是定义,即使声明变量为extern:
extern double pi = 3.1416 //definition

只有当extern声明位于函数外部时,才可以含有初始化式。

因为已初始化的extern声明被当做是定义,所以该变量任何随后的定义都是错误的:
extern double pi = 3.1416 //definition
double pi; //error:redefinition of pi

对于头文件不应该含有定义这一规则,有3个例外。头文件可以定义类、值在编译时就已知的const对象,inline函数 p59

设计头文件需要注意:头文件所作的声明在逻辑上应该是适于放在一起的。编译头文件需要一定时间。如果头文件太大,程序员可能不愿承受包含该头文件所带来的编译时代价。
为了减少处理头文件的编译时间,有些c++实现支持预编译头文件 p58

常量在定以后不能修改,所以定义时比如初始化: p49
const int i=0;

在全局作用域里定义的非const变量时,它在整个程序中都可以访问。
//file_1.cc
int counter; //definition
//file_2.cc
extern int counter; //uses counter from file_1
++counter; //increments counter defined in file_1
与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。
通过指定const变量为extern,就可以在整个程序中访问const对象,就可以在整个程序中访问const对象:
//file_1.cc
extern const int bufSize=fcn();
//file_2.cc
extern const int bufSize; //uses bufSize from file_1
for (int index=0;index != bufSize;++index)
//...
本程序,file_1.cc通过函数fcn()返回值来定义和初始化bufSize。而bufSize定义为extern,也就意味着bufSize可以在其他文件中使用

枚举(enum)

what enum:定义了整数常量集合(与const不同,它把相同概念的常量分为一个组)

how 定义enum以及enum成员:
enum open_modes{input,output,append} ;//input is 0,output is 1,append is 2
默认地,第一个枚举成员赋值为0,后面每个枚举成员赋值的值比前面大1

可以为一个或多个枚举成员提供初始值,用来初始化枚举成员的值必须是一个常量表达式
enum Forms{shape=1,sphere,cylinder,polygon}; //shape=1,sphere=2,cylinder=3,polygon=4
在枚举类型Forms中,显示将shape赋值为1,其他枚举成员隐式初始化

enum Points{point2d=2,point2w,point3d=3,point3w}; //point2d=2,point2w=3,point3d=3,point3d=4

不能改变枚举成员的值。枚举成员本身就是一个常量表达式,所以也可用于需要常量表达式的任何地方

每个enum都定义了一种新的类型。枚举类型对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行
Points pt3d=point3d; //ok
Points pt2w=3; //error
注意:把3赋值给Points对象是非法的,即使3与一个Points枚举成员相关联

c++自动将枚举类型的对象或枚举成员转换为整型,其转换结果可用于任何要求使用整数值的地方。
将enum对象或枚举成员提升为什么类型由机器定义,并且依赖于枚举成员最大值。但至少提升为int型。 p157

在使用有枚举类型形参的重载函数时,请记住:由于不同枚举类型的枚举常量值不相同,在函数重载确定过程中,不同的枚举类型会具有完全不同的行为。其枚举成员决定了它们提升的类型,而所提升的类型依赖于机器。 p235
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: