C和C++都有const这个关键字,虽然有相似,但是也有不同。
const 在 C++ 与 C 中的不同:
1、C 中被 const 所修饰的叫做常变量,(被修饰的内容不可做左值。)
2、C++ 中被const 所修饰的内容叫做常量,
(1)必须初始化
(2)不允许普通的指针指向,只能用const类型的指针指向
举例来说:
const int a=10;
int *p=&a;
*p=20;
这几行代码在C中是没有问题的,但是在c++中是错误的,因为C++中的constt所修饰的内容是不允许普通指针指向的。
另外,当const 修饰的是全局变量时,该全局符号会具有 local 属性,只在本文件可见,从而可能出错,所以,我们需要在前面再加个 extern 关键字。(将local属性的符号变成global 属性)
C++中const和一级指针的结合
一级指针和const的结合较为简单,前边好像写过了,可以去看看
/*
int a = 10;
const int* p = &a;
const int* q = p;
*/
/* int a = 10;
int* p = &a;
int* q = p;*/
/*
const int a = 10;
const int* p = &a;
const int* q = p;
*/
/* int a = 10;
int* const p = &a;
int* q = p;*/
/* int a = 10;
int* p = &a;
const int* q = p;*/
C++中const和二级指针的结合
我们分析一下这句代码:
int a = 10;
int* p = &a;
const int**q = &p;
从C语言的权限不能扩大传递来看,最后一个语句,左边是 const int **类型,右边是 int** 类型,权限明显是缩小传递的,但确是错的
因为该语句执行时,编译器认为对 q 而言,**q 的值是一个常量,不能被修改。而当我们把非 const 地址(&p)赋给 const 指针(q),存在隐藏的风险,我们有可能通过 p 来修改这个 const 数据(**q),const int **q 并不代表着它指向的是一个常量,**q指向的a只是个 int 类型。它只意味在这一条语句中对 q 而言,**q是个常量。你可以通过给 a 赋值来改变 a的值,但你不可以通过 q 去改变 a 的值。所以这条语句是错误的。把该句改为 const int *const* = &p;即可。或者 const int* p = &a;
其他情况先不分析了:
C++中const和引用的结合
引用传入
引用是一个别名
底层处理:
C++中和指针处理方式相同,在用到引用变量的地方 系统会自动来解引用
引用的特点
1.必须要初始化
2.引用初始化的变量一定要可以取地址
3.引用是不可改变
4.引用只能访问引用变量所引用的内存单元。
常引用引用立即数:
(1)立即数放到临时量中
(2)常引用来引用临时量
引用做形参:
(1)引用修改实参的值
(2)引用不能引用立即数,部分实参无法访问
不能反回局部变量的地址或引用