const用法详解

本文深入探讨了C++中const关键字的使用,包括其在不同上下文中的含义,如只读成员、指针和引用。文章详细解释了const在指针声明中的位置差异及其对变量读写权限的影响,为程序员提供了实用的编程建议。

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

目录

前言

  本博文又名const T vs. T const ——Dan Saks 读后感,链接见文末

const位置解读

const T p;//p is a T const.p为只读,地址不能变,存储内容不能变
T const *p;//p is a point to T const.p是一个指向T类型的指针,地址能改变,地址内的存储内容不能变
const T *p;//同2
T *const p;//p is a const point to T,p是一个指向T类型的指针,地址不能变,地址内的存储内容能变
const T *const p;//p is a const point to T cosnt //p是一个指向T类型的指针,地址不能变,地址内的存储内容也不能变
T const *const p;//同5

比较好的习惯

  在C和C++中的每个声明都有两个主要部分:零个或者更多声明说明符,和一个以上用逗号隔开的声明符
  例如:

static unsigned long int *x[N];

static unsigned long int//声明说明符
*x[N]//声明符

一个声明符就是被声明的名称,可能伴有操作符,比如*,[],(),和(C++中的&。正如你所知的,声明中的符号*表示“指针”,[]表示“序列”因此,*x[N]表明x是个“有N个指针元素的序列,分别指向某某”,某某就是声明中指定的类型。例如:

static unsigned long int *x[N];//把x声明为“指向unsigned long int 的N个指针元素的序列”的一个对象。

为什么我知道*x[N]是一个指针的序列,而不是指向一个序列的指针?它遵循以下规则:

  在一个表达式中,声明符中的操作根据他们的优先级来分组

  例如,在C和C++中,如果检查最近优先级图标,你会发现[]的优先级比更高。因此声明符X[N]表明x是一个优先于指针的序列。原括号在声明符中有两个作用:第一,作为函数调用的操作符,第二,用来分组。作为函数调用的操作符,()和[]的优先级相同。用作分组时,()的优先级最高的。
另外有个重要观点:

  声明说明符在一个声明中出现的顺序并不重要

声明说明符const和volatile不寻常,因为:
能出现在声明符中的声明说明符只有const和volatie
所以:

void *const vectorTable[]//可以
*const void vectorTable[]//是错误的

下面的声明是等同的:

const void *vectorTable[]//大多数C和C++程序员喜欢把const和volatile写在其他类型的说明符的左边
void const *vectorTable[]//我更喜欢把const和volatile写在右边,并且强烈推荐这么写。

const用法详解

  C++基本上是按从头到尾,从左到右的顺序来读,但是指针的声明,从某种意义来讲却是倒着的。指针的声明是从右到左来看。
  把const放在其他类型说明符的右边,可以严格的从右到左来看指针说明,还可以把const从“右边的”位置提出来,如:

T const *p;//把p声明为“指向const T的指针”,非常准确
T *const p;//把p声明为指向T的const指针“也能正确理解

参考资料

  const T vs. T const ——Dan Saks 【翻译】
  const T vs. T const ——Dan Saks
  const指针和指向常量的指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值