数据类型判断

要想弄清这些声明的含义最行之有效的办法是从右往左阅读。

《C++ Primer》如是说。

int errNumb = 0;
int *const curErr = &errNumb;
const double pi = 3.14;
const double *const pip = π

int *const curErr = &errNumb;

离curErr最近的为const,表示curErr是一个常量对象;
接着是解引用操作符,表示curErr是常量指针;
剩下的int表示指向int类型的常量指针;

所以curErr是一个指向int类型的常量指针 pip是一个指向const double类型的常量指针

顶层const与底层const

//底层const-指针所指的对象是一个常量
//顶层const-指针本身是个常量
int i =0;
int *const p1 =&i;//顶层
const int ci =42;//顶层
const int *p2 =&ci;//底层
const int *const p3 =p2;//顶层
const int &r =ci;//底层

一般的,顶层const可以表示任意的对象是常量。 简单理解就是只要一个变量的类型是常变量,就可以理解为顶层 (如const int a = 20) 顶层const能表示的不止是指针,底层const与指针和引用等复合类型有关

区分底层与顶层const

int *const p1 =&i;//顶层

p1是一个常量指针,指向int类型的对象,即指针本身是个常量

const int *p2 =&ci;//底层

p2是一个指针,指向int类型的常量对象,即指针指向的对象是个常量

为何会有顶层与底层的区分

我们来看下面这段代码

	int i =0;
	int *const p1 =&i;//顶层
	const int ci =42;//顶层
	const int *p2 =&ci;//底层
	i = 20;
	cout << i << ' ' << *p1 << endl;//ture
	*p1 = 20;
	cout << i << ' ' << *p1 << endl;//true
	*p2 = 50;
	cout << ci << ' ' << *p2 <<endl;//err

i是一个变量,p1是个常量指针,我们对i进行重新赋值时,p1的值也跟着变化; ci是个常变量,p2是个指针,对p2解引用重新赋值后,报错 当我们对顶层const执行拷贝操作时,基本上不会出现问题; 但底层const 的限制比较大。 熟练的区分底层与顶层const能让我们知道哪些变量可以重新赋值,哪些不能。 (☆▽☆)