2.2.2声明和定义的关系
声明使得名字为程序所知,一个文件如果想使用别处的定义的名字则必须包含对名字的声明,而定义则负责创建与名字相联的实体
extern int i;//声明而非定义
int i//声明并且定义j
初始化的声明等于定义
变量能被定义一次,但可以被多次声明
2.2.4名字的作用域
嵌套得的作用域
作用域能彼此包含,被包含(或者说被嵌套)的作用域被称为内层作用域
作用域一旦声明了某个名字,它嵌套的所有作用域都能被访问该名字。同时,允许在内层作用域重新定义外层作用域已有的名字
#include<iostream>
int reused=42;//拥有全局作用域
int main()
{
int unique=0;//拥有块作用域
std::cout<<reused<<"; "<<unique<<std::endl;
//42 ;0
int reused=0;//新建局部变量reused,覆盖了全局变量reused
std::cout<<reused<<" "<<unique<<std::endl;
//输出0,0
std::cout<<::resued<<""<<unique<<std::endl;
//::显式地访问全局变量输出结果42 0;
2.3.1引用
引用为对象起另外一个名字
int ival=1024;
int &refval=ival;//refVal指向ival
int &refval2//错误,引用必须被初始化
一般在初始化变量时初始值会拷贝到新建的对象中,然而定义引用时,程序把引用和它的初始值绑定在一起而不是将初始值拷贝给引用,一旦初始值完成,引用将它的初始值对象一直绑定在一起
引用就是别名:引用并非对象,相反的,它只为一个已经存在的对象所起的另外一个名字。
定义了一个引用之后对其进行的操作都是与之绑定的对象上进行的:
refVal=2;
int ii=refVal;
引用的定义
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头:
int i=1024,i2=2048;//i和i2都是int
int &r=i,r2=i2;//r是一个引用,与i绑定在一起,r2是int
int i3=1024,&ri=i3;
int &r3=i3,&r4=i2;
int &refVal4=10;错误:引用类型的初始值必须是一个对象
double dval=3.14;
int &refVal5=dval; 错误:引用类型的初始值必须是int型对象