C++:变量

c++的标识符由字母、数字、下划线组成,必须以字母或者下划线开头。对长度没有限制,大小写敏感。不能使用关键字,不能连续出现两个下划线,不能以下划线紧连大写字母开头,函数体外的标识符不能以下划线开头(其实编译能通过)。

初始化

下面四种方式都可以对变量进行初始化:

int a = 0;
int a = {0};
int a{0}; //列表初始化
int a(0);

对于列表初始化方式,C++ 11支持,要增加编译选项-std=c++0x.另外,定义于任何函数体之外的内置类型变量,如果没有初始化,则使用默认初始化值,而定义在函数体内的内置类型变量,则不会被默认初始化,是一个未初始化的值。建议初始化每个内置类型的变量.

定义和声明

这个概念对C++的分离式编译机制非常重要。变量只能被定义一次,但可以多次声明。声明确定变量的名字和类型,使名字为程序所知,而定义创建与名字关联的实体,会分配存储空间。

extern int i; //声明
int i; //定义
extern int i = 0; //定义,初始化了的声明成为定义

复合类型

引用:引用就是别名,三点要求,一是引用的类型要与绑定的对象严格匹配;二是引用只能绑定在对象(变量)上,不能绑定在字面值常量或表达式的计算结果上;三是引用必须初始化,且初始化后不能再绑定到其他对象上。

指针:指针也是一个对象,也要求类型匹配。生命周期内可以先后指向几个不同的对象,而且不必在定义时赋初值。下面是几种定义空指针的方法:

int *p1 = nullptr; //C++ 11,推荐
int *p2 = 0; 
int *p3 = NULL; //等价于int *p3 = 0;避免这种用法

另外,void* 指令可以存放任意对象的地址。

const限定符

const对象必须被初始化,初始值可以是任意类型。默认情况下,const对象仅在文件内有效。这是因为编译时要获取const对象的初始值,就必须有对该const对象的定义,然而一个变量又只能定义一次,为了支持这种做法,使const对象仅在文件内有效,也就是说,如果多个文件中出现了同名的const对象,则等同于在不同的文件中分别定义了独立的变量。

为了使多个文件共享const对象(只在一个文件中定义const对象,其他文件中声明并使用它),可行的做法是,对于const对象,不管是声明还是定义都添加extern关键字。

//file1.cpp,定义并初始化一个常量,该常量能被其他文件访问
extern const int bufSize = fn();
//file1.h,指明该对象不是当前文件独有
extern const int bufSize;

对const的引用

对常量的引用(常量引用)不能被用来修改它所绑定的对象。

const int ci = 1024;
const int &r1 = ci;//正确,引用及其对应的对象都是常量
r1 = 42; //错误,r1是对常量的引用
int &r2 = ci;//错误,试图让一个非常量引用指向一个常量对象

初始化常量引用时允许用任意表达式作为初始值,只要改表达式的结果可以转换为引用的类型即可。允许为一个常量引用绑定非常量的对象、字面值或者表达式。

int i = 42;
const int &r1 = i;//正确,此时不允许通过r1改变i的值
const int &r2 = 42; //正确
const int &r3 = r1*2;//正确
int &r4 = r1*2;//错误

当一个常量引用被绑定到另外一种类型上时:

double dval = 3.14;
const int &r1 = dval;

实际上会创建一个临时变量,然后将常量引用绑定在该临时变量上:

const int temp = dval;
const int &r1 = temp;

当r1不是常量引用时,允许对r1进行赋值,此时r1绑定在一个临时量上,那么这种赋值也就没有意义了,所以C++规定这种做法是非法的。

指向常量的指针

指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。而且,指向常量的指针可以指向一个非常量对象。

const double pi = 3.14;
double *ptr = π//错误,ptr是一个普通指针
const double *cptr = π//正确
*cptr = 42;//错误,不能修改*cptr的值

常量指针(const指针)

常量指针,即指针本身为常量,必须被初始化,且初始化后不再改变。不变的是指针本身的值而不是指针指向的值。

int errNumb= 0;
int *const curErr = &errNumb;//curErr将一直指向errNumb
const double pi = 3.14;
const double *const pip = π//pip为指向常量对象的常量指针

顶层const

顶层const指的是本身不可以被改变。底层const指的是自身所指对象不可以被改变。用于声明引用的const都是底层const。顶层const的拷贝不受限制,但是底层const的拷贝的对象必须具有相同的底层const资格。一般来说:非常量可以赋值给常量,反之则不行

推荐阅读更多精彩内容