C++ 引用、指针、const
引用
- 引用就是对象的一个别名,常用作函数的形式参数。通过在变量名前加“&”来定义。不能定义引用类型的引用,什么是引用类型的引用?
int a = 10;
int& b = a;
int& c = b;
//上面代码可以编译通过,且可运行,c的值也为10
int&& d = c; //编译不通过,这是引用类型的引用,就如int** p是指针的指针同理
- 引用是别名
因为引用只是所绑定对象的一个别名,所以对引用所作的操作都会作用到它所绑定的对象上。
- 引用必须用于该引用同类型的对象初始化
int i = 1024;
int& ref1; //error:未初始化
int& ref2 = 100; //error:初始化必须为一个同类型的对象
int& ref3 = i; //ok
引用与指针区别
- 相同点
指针和引用都是地址的概念,指针指向一块内存,它的值是这块内存的地址;引用是某块内存的别名。
- 区别
- 引用是个别名,指针是个实体
- 指针可以为空,引用不能为空
- 引用使用时不需要解引号(*),而指针需要
- 引用只能在定义时初始化一次,之后不能改变,指针可以改变指向的对象
- “sizeof引用”得到的是所绑定对象的大小,而“sizeof指针”得到的是指针本身的大小
- 引用和指针的自增运算符(++)意义不一样
引用与指针不难区别,当引用和指针加上const就懵了,看看它们之间的用法吧。
const与引用,指针
const用法
- const用法主要是防止定义的对象再次被修改,把修饰的对象转变为了一个常量,定义const类型的变量时要初始化。
const int size = 1024; //定义size为常量并初始化为1024,变量size仍然是一个左值,但是是一个不可修改的左值
size = 10; //error:不可修改const修饰的对象
- const对象默认为文件的局部变量
在全局作用域声明的const变量是定义在该对象的文件的局部变量,此变量只存在于那个文件中,不能被其它文件访问。通过制定const变量为extern,就可在整个程序中访问const对象。
//file1.cpp
extern const int buf = 512;
//file2.cpp
extern const int buf; //file1.cpp中buf必须显式地加上extern才能编译通过并使用
const与引用
- const引用
const引用是指向const对象的引用
const int val = 1024;
int& ref1 = val; //error:非const引用绑定一个const对象是非法的
const int& ref2 = val; //ok
//上面代码中ref2不能修改了,任何对ref2的赋值操作都是非法的
const引用可以初始化为不同类型的对象或者初始化为右值
int i = 10;
const int& ref = 20;
const int& ref2 = ref+i;
//编译通过
const与指针
- 指向const对象的指针
我们可以使用指针来修改所指对象的值,但是如果指针指向的是const对象,我们就不能让指针来修改所指对象的值,c++强制要求指向const对象的指针必须具有const特性。
const int* cptr;
//cptr是一个指向int类型const对象的指针,const限定了cptr指针所指向的对象的类型,而非cptr指针本身。即cptr并不是const。在定义时也就不需要对cptr进行初始化,如果需要,cptr可以改变指向其它 const int型的变量。但不能通过cptr改变所指对象的值
*cptr = 20; //error:不能修改cptr所指对象的值
允许把非const对象的地址赋给指向const对象的指针
int val = 2;
const int* ref = &val; //ok,尽管val不是const对象,但是任何想通过ref修改其值的香味都会编译错误
//但是val不是const对象,所有有可能被其它方式修改值,只是ref不能修改val的值
- const指针
指针本身的值不能修改,即不能改变指针指向其它对象,任何给指针赋值的行为都会编译错误,const指针也必须在定义时初始化。
- 指向const对象的const指针
const int* const ptr = &a; //既不能修改所指对象的值,也不允许修改指针指向