C/C++判断数据类型与顶层const与底层const的区分

数据类型判断

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

《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能让我们知道哪些变量可以重新赋值,哪些不能。
(☆▽☆)

猜你喜欢

转载自blog.51cto.com/15093262/2670857