2-2 理解const
1 const
- 在引用中注意不能为常量绑定一个非常量的引用
- 在指针中区分
low-level const
和top-level const
const
通常用于定义常量,一经定义不许修改,且使用const
必须初始化
2 定义形参
当我们在使用某个函数时,不希望变量在函数内部被改变,则可以将形参定义为const
形式
void function (const int value)
3 const与引用
const
和引用放在一起使用时要注意,常量值不可以绑定到非常量的引用上,但是非常量可以绑定到常量的引用上。
non-const -> const
const !-> non-const
非常量值绑定到常量类型的引用是因为编译器帮我们产生了一个const
类型的临时变量,比如:
int i=1;
const int &value=i;
//编译器行为
const int temp=i;
const int &value=temp;
4 const与指针
如果我们需要一个指针指向常量时,那么这个指针也必须是常量类型,否则编译器会报错。另外在C++ Primer中我们可以看到low-level const
和top-level const
这样的概念,通过一个例子来理解
const int value=123;//top-level
const int *pvalue=&value;//low-level
*pvalue=456; //错误
const int value=123;
const int *pvalue=&value;
int vol_value=456;
pvalue=&vol_value;//正确
这里注意在第一段的程序里const
修饰的并不是pvalue
,而是外面的int
部分,这里应该理解为一个指针pvalue
指向const int
类型,即它的指向类型不能变。由于其所指地址是常量属性,常量不允许被修改,所以会报错,但是指针pvalue
还是可以改变所指方向的。
那么如果我们不希望指向常量的指针被修改,那么就应该让它成为top-level const
,它所修饰的就是指针这个对象了,即如下所示
const int *const pvalue
区分top-level
还是low-level
并不是说看const
在里面还是在外面,而是看他所修饰的是什么。对于指针这样的复合类型来说,如果修饰的是一个对象,那就是top-level
,如果修饰的是基本类型,那就是low-level
了