1、C++中初始化和赋值是俩个完全不同的操作,初始化的含义是创建变量时赋与其一个初始值;而赋值的含义是把对象的当前值擦除,而以一个新的值代替。
string类规定如果没有指定初始值就生成一个空串,定义于任何函数体之外的变量被初始化为0(但有一种特殊情况,定义在函数体内部的内置类型将不被初始化,static关键字)
2、extern关键字来声明变量,
extern int i;//只是声明i
int j; //声明并定义j
在函数体内部,初始化一个由extern声明的变量,将报错。
变量能且只能被定义一次,但是可以被多次声明。
3、C++的标识符由字母、数字和下划线组成,其中必须以字母和下划线开头,标识符长度没有限制,但对字母大小写敏感。
4、作用域操作符::,如果函数定义了一个全局变量,不宜再定义一个同名的局部变量(在块作用域内,局部变量的值会覆盖掉全局变量的值)。
5、引用必须初始化(定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和她的初始值对象一直绑定在一起)
引用即别名,它并非对象,只是为已存在的对象起的另外一个名字(对引用的所有操作都是在与之绑定的对象上进行的)
不能定义引用的引用;引用的类型必须与绑定的对象严格匹配。引用只能绑定在对象上,不能绑定与字面值或某个表达式的结果绑定)
6、不能定义指向引用的指针(引用不是对象,没有实际地址)
指针的类型要和它所指向的对象严格匹配(除const-P534)
指针值只能有以下四种状态:
1)指向一个对象。
2)指向紧邻对象所占空间的下一个位置。
3)空指针,指针没有指向任何对象。
4)无效指针,其他值。
解引用符*(对指针解引用得到所指对象)如果对解引用的结果赋值,也就是对指针所指对象赋值
int a = 42;
int* p = &a; //p是指向变量a的指针
cout<< * p; //对p解引用,得到p所指的对象
* p = 0; //p解引用得到p所指的对象,将0赋值给所指向对象
cout<< * p; //输出0;
&和*的多重含义
int i= 42;
int& r =i; //&紧随类型名出现,是申明的一部分,r是一个引用
int* p; //*紧随类型名出现,是申明的一部分,p是一个指针
p = &i; //出现在表达式中,是一个取地址符
* p = i ; //出现在表达式中,是一个解引用符
int& r2 = * p; //&是声明的一部分,*是一个解引用符
(只要是紧随类型名出现,一定是声明的一部分)