您的位置:首页 > 编程语言 > C语言/C++

【c++】c++中顶层const与底层const

2019-03-15 10:59 106 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_ape/article/details/73087742

首先看下定义

顶层const是指   const修饰的是指针,即此指针是常量指针,一旦指向某个对象,则不能指向其他对象

底层const是指  const修饰的是指针所指向的对象为常量,不能通过指针去修改对象的值

[code]const int *pa;//底层const
int a;
int *const pb=&a; //顶层const,需要定义时初始化

 

以下则是C++ Prime英文版的解释
2.4.3.Top-Level const

As we’ve seen, a pointer is an object that can point to a different object. As a result,
we can talk independently about whether a pointer is const and whether the objects
to which it can point are const. We use the term top-level const to indicate that the
pointer itself is a const. When a pointer can point to a const object, we refer to
that const as a low-level const.

 

关于顶层const和底层const,需要注意的一点就是在作为函数参数时的区别,函数中形参的顶层const会被忽视,从而可能产生以下的编译错误。

 

 

[code]void fun(int *p){  //一切最简单化

}

void fun(int *const p){  //顶层const会被忽视,从而导致函数重复定义

}

1>: error C2084: 函数“void fun(int *const )”已有主体
1>    : 参见“fun”的前一个定义
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
由于编译器检测形参的类型,所以两个fun函数都是int *类型的形参,所以编译器会认为函数重复定义

 

 

而c++ Prime中关于const 形参和实参章节,使用了以下的例子

 

[code]void fun(int i){

}

void fun(const int  i){

}

编译器同样也出现了上面的函数重复定义错误

 

然而我们会发现这个例子中的const并不是顶层const 和底层const的范畴,关于定义可以详细阅读上面的英文定义。

但是我们可以这样理解,如果const修饰的直接对象是无法修改的,那么在作为形参时,将会忽视掉这个const,上面例子中的变量i 就是可以这么理解,无法修改i 的值,顶层const也是直接修饰的是指针对象,如第一个例子,指针p是无法修改值的。

 

所以我们在使用const修饰的变量作为形参时,只要遵循上面的定律,看const直接修饰的对象能否修改,来判断是否会出现以上的错误。

还有一小点,如果const直接修饰的对象不能修改,那么给它传常量对象或非常量对象都是可以的,这也印证了“顶层”const会被忽视。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: