1、变量的声明和定义
1.1、变量声明规定了变量的类型和名字。定义初次之外,还申请存储空间,也可能会为变量赋一个初始值。
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显式地初始化变量:
extern int i; // 声明i而非定义i
int j; // 声明并定义j
extern语句如果包含初始值就不再是声明,而是定义了:
extern int ss = 4; // 定义
在函数内部,如果视图初始化一个有extern关键字标记的变量,将引发错误。
2、引用
引用为对象起了另外一个名字。
int ival = 1024;
int &refVal = ival; // refVal指向ival(是ival的另一个名字)
int &refVal2; // 报错:引用必须初始化
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。
int &refVal4 = 10; // 错误,引用类型的初始值必须是一个对象;
double dval = 3.14;
int &refVal5 = dval; // 错误,引用类型的初始值必须是int类型对象
3、指针
int ival = 42;
int *p = &ival;
利用指针访问对象:
如果指针指向了一个对象,则允许使用解引用符(操作符*)来访问该对象;
cout << *p ; // 由符号*得到指针p所指的对象,输出42
4、const限定符
const修饰的变量,其被定义为常量。
const int i = get_size(); // 正确,运行时初始化
const int j = 42; // 正确,编译时初始化
const int k; // 错误,k是一个未初始化的常量
默认状态下,const对象仅在文件内有效。
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。
// file_1.cpp定义并初始化一个常量,该常量能被其他文件访问
extern const int bufferSize = fcn();
// file_1.h 头文件,与file_1.cpp中定义的bufferSize是同一个
extern const int bufferSize;
对常量的引用:
const int ci = 1024;
const int &r1 = ci;
r1 = 42; // 错误,对常量的引用不能被修改
int &r2 = ci; // 错误,试图让一个非常量引用指向一个常量对象
对常量的引用可能引用一个并非const的对象
int i = 42;
int &r1 = i;
const int &r2 = i; // r2绑定对象i,但是不允许通过r2修改i的值
r1 = 0; // 正确 r1并非常量,i的值修改为0;
r2 = 0; // 错误,r2是一个常量引用