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

  • 定义变量也是声明。可以通过使用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









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值