变量初始化
C++支持两种初始化变量的形式:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化是把初始化式放在括号中。
intival (1024); //直接初始化
int ival = 1024; //复制初始化
需要注意的是,初始化并不是赋值,使用=来初始化变量与赋值是不一样的。并且在这两种初始化方式中,直接初始化语法更灵活,效率更高(为什么?)。
内置类型变量的初始化规则
内置类型变量是否初始化取决于变量定义的位置。在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量不进行初始化。事实上,未初始化的变量都有一个随机的值,由此可能引起未知的错误。
全局作用域
定义在所有函数外部的变量具有全局作用域,可以在程序的任何地方访问。
const对象默认为文件的局部变量
在全局作用域里定义非const型的变量时,它在整个程序中都可以访问。与其它变量不同,除非特别说明,在全局作用域声明的const型变量是定义该对象的文件的局部变量,即只存在于本文件,不能被程序的其它文件访问。
然而,通过指定const变量为extern,就可在整个程序中访问它。
extern的一些用法
一、修饰符extern用在全局变量或者函数的声明前,用来说明“此全局变量/函数是在其它源文件定义的,要在此处引用”。
二、当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载 。
指向const对象的引用
指向const对象的引用可以初始化为不同类型(但类型相关,如int和double)的对象或者初始化为右值,如字面值常量:
int i = 42;
const int &r = 42;//ok
const int &r2 = r + i;//ok
然而,非const引用只能初始化为与它同类型的对象。
int &r3 = i;//ok
int &r4 = 42;//error
枚举
枚举的定义:(关键字) enum 枚举类型名 {枚举成员列表};
如:enum open_modes {input,output,append};
默认第一个枚举成员赋值为0,其后的每个成员比前一个成员的值大1。枚举成员是常量,用来初始化枚举成员的值必须是一个常量表达式。枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其它对象来进行。
头文件设计规范
在设计头文件时要注意,头文件用于声明而不是定义。有三个例外,头文件可以定义类、一些作为常量表达式的const对象和inline函数。