C++ 顶层const和底层const

发布时间:2026/10/19 10:34:35
C++ 顶层const和底层const 咱们先看一下这个例子int m const int n; const int *p1n; int *const p2m; const int *const p3n;想要弄清楚这些声明的含义最行之有效的方法就是从右向左阅读此例中离p2最近的符号是const意味着p2本身是一个常量对象对象的类型由声明符的其余部分确定。声明符中的下一个符号是*意思是p2是一个常量指针。最后该声明语句的基本数据类型部分确定了常量指针指向的是一个int对象。与之相似我们也能推断出p3是一个常量指针它指向的对象是一个int型常量。但这些一个声明中出现多个const这const有什么区别吗众所周知指针本身是一个对象它又可以指向另外一个对象。因此指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。用名词顶层const表示指针本身是个常量而用名词底层const表示指针所指的对象是一个常量。更一般的顶层const可以扩展到任意数据类型而底层const则与指针和引用等复合数据类型的基本类型部分即上面例子中基本数据类型如int的左部分有关。例如int i0; int *const p1i; //顶层 const int ci42; //顶层 const int *p2ci; //底层 const int *const p3p2; //底层 顶层 const int rci; //底层 用于声明引用的const都是底层const int const r1i; //非法引用不是对象只是指向对象的“别名”此例中也简单介绍了引用的区别当执行对象的拷贝操作时常量是顶层const还是底层const区别明显。其中顶层const不受影响ici; p2p3; p2i; i*p2执行拷贝操作并不会改变被拷贝对象的值因此拷入和拷出的对象是否是常量都没什么影响。另一方面底层const的限制却不能忽视。当执行对象的拷贝操作时拷入和拷出的对象必须具有相同的底层const资格或者两个对象的数据类型必须能够转换。一般来说非常量可以转换为常量反之则不行int *pp3; //非法p3包含底层const的定义意味着p3指向的内容不可以改变 //如果将p3赋给p,那么就可以通过p间接修改p3指向的内容那其p3的底层const将毫无意义 p2p3; p2i; //int*可以转化成const int* int rci; //非法 const int r2i;

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询