C++ 语法 const限定符

本文详细探讨了C++中的const限定符,包括常量指针和指向常量的指针的区别,顶层const与底层const的概念,以及拷贝时const限定符的变化规则。此外,还介绍了const在修饰类成员函数、函数重载和const_cast中的应用,强调了在拷贝初始化和拷贝赋值时添加或去除const的合法性及其注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const限定符是常用且容易混淆的概念,很多书中讲解不清晰,甚至《C++ primer》中都有一些错误的论断或者不明确的区分,本文对const限定符做归纳总结。

一、在类型中

顶层const和底层const是一个非常容易让人遗忘和混淆的概念,这里包括常量词性(即使名词常量,也是形容词常量的)和C++类型定义从右向左的释义顺序与日常语言从左向右理解的顺序差异造成的混淆。

首先将常量指针和指向常量的指针加以区分:

1.1 const pointer V.S. pointer to const

a) const pointer 常量指针 (其实英文语义很明显,没有歧义,中文隐藏了“的”,即常量的指针)

这里的const和常量是形容词,其实表示的是常量的指针。指的是指针本身是常量。但C++语法的释义并非是正常的从左向右读,而是从右向左解释,例如:

int errNumb=0;
int *const ptr=& errNumb; //从右向左释义:ptr是常量的*(指针),指针指向int类型的对象,即常量指针指向int类型的对象

即我们说的常量指针const pointer在C++语法中实际是写成* const

禁止修改常量指针的值。

b) pointer to const指向常量的指针

这里的const是名词。

const double pi=3.14;
const double *cptr=& pi; //从右向左释义:cptr是*(指针),指针指向double类型的对象,double类型的对象是const的,即指针指向double类型的常量

对于指向常量的指针,禁止通过指针修改指向的变量的值。

 c) const pointer & pointer to const

const double pi=3.14;
const double *const cptr=& pi; //从右向左释义:cptr const的*(指针),指针指向double类型的对象,double类型的对象是const的,即常量指针指向double类型的常量。其中第一个const是pointer to const(即底层const),第二个const是const pointer(即顶层const)

1.2 顶层const与底层const

  • 顶层const可以表示任何数据类型是(自身)常量,例如:int , double, *, class等;
  • 底层const表示指针和引用的复合类型的基本类型部分是常量。

指针是对象,因此既有顶层const(指针本身),也有底层const(指针所指的对象)。 

引用不是对象,因此只存在reference to const / 对常量的引用,即底层const, 不存在顶层const/常量引用。(注意:《C++ primer》中文版中2.4.1的标题写的是const的引用,显然是错误的,引文版中的题目是references to const,大家不要被常量引用的说法误导,并没有常量引用,只有对常量的引用)

总结:reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuyuelongfly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值