C++ 2.4 const限定符,指针常量-顶层 const,常量指针-底层 const

本文深入解析C++中const限定符的使用,包括常量赋值、函数声明、连续变量声明、引用与指针结合const的规则,以及顶层与底层const的区别。同时介绍了C++11中新增的constexpr关键字,帮助开发者更熟练地掌握常量定义和优化代码。

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


const 限定常量

eg.
const int con = 1024; 定义一个 int 型的常量
变量con的值,不可改变

赋值一个函数

const int con = func();

声明连续变量

const 声明连续变量时,都有效

const int con1=1, con2=2, con3=3;

con1、con2、con3 都是常量


const 与引用 const [type] &

指向常量的 常量引用,本身也必须是一个常量。
该引用变量不能被改变。

const int con1 = 1024;
const int &con2 = con1; //对常量的引用,简称常量引用,也必须是一个常量
const int &con3 = 1024; //常量引用,可以赋上一个字面值。而非常量引用是不行的
int cVal = 1;
const int &con4 = cVal; //常量引用,可以赋值一个非常量的变量

注意,con4,被赋值上一个非常量值。con4本身不能被改变,但指向的非常量值是可变的。修改非常量值:

cVal = 197;
cout << con4 << endl;   

会输出 197

指向常量的常量引用,本身也必须是一个常量
指向非常量的常量引用,非常量值改变,引用值也改变
不能通过自身去改变指向的值


const 与指针

常量指针: const [type] * 或 [type] const *

常量指针,本质上是一个指针。const [type] * 或 [type] const * 声明都可以。
指向常量的指针,本身也必须是一个常量。
但是,指针变量本身可以被重新赋值。

const int con1 = 1024;
const int *con2 = &con1; //指向常量的指针
int cVal = 1;
const int *con3 = &cVal;  //指向非常量的指针

int cVal2 = 197;
con2 = con3 = &cVal2;
cout << *con2 << endl;
cout << *con3 << endl;

如上,形如 const type * 定义的变量,无论指向的是一个常量,还是非常量。都可以重新指定指向的地址。
通过 指针解引用符来改变 指向的原始值,是不行的。 *con3 = 200;//error

指针常量: [type] *const

指针常量。本质是一个常量,该常量是一个指针类型。声明定义:先类型指针,后跟常量符const。
定义时,必须初始化。因该指针是一个常量,所以就无法被重新赋值,会一直指向初始值地址。

int con1 = 1024;
int *const con2 = &con1; //常量指针
int cVal = 1;
*con2 = 10;
con2 = &cVal;  //error

如上,con2的地址无法被改变,但地址指向的值是可变的。

指针本身不可变,且地址指向的值也不可变: const [type] *const

综合上面两种定义,

int con1 = 1024;
const int *const con2 = &con1;
int cVal = 1;
*con2 = 10; //error
con2 = &cVal; //error

如上, con2的地址无法被改变,且地址指向的值也不可变。


顶层 const 和 底层 const

顶层 const (top-level const) 表示本身是一个常量
底层 const (low-level const) 表示指向的是一个常量
通俗的讲,
顶层 const,即(指针或引用或其它类型)变量本身不可变;指向对象的值可修改。
底层 const,即(指针或引用或其它类型)变量所指向的对象值不可变。指向谁,可修改。

对于指针来说:
type * const 是顶层的;
const type * 是底层的。
对于引用来说:
const type & 是底层的。

既是顶层也是底层 const:

const int *const ccp = &cv;//左边是 low const,右边是 top const;

记忆口诀:左底右顶,顶是个常量,底指向常量


cpp11: constexpr 常量表达式

cpp11 新增关键字constexpr,可用于声明常量,和常量函数。

constexpr int rv() {
    return 100;
}
constexpr int xd = 88;
constexpr int xxd = rv();

使编译器在编译期间验证,常量定义是否正确。
由于在编译期间要确定常量值,所以非基本类型不可用于 常量表达式。像是指针类型 就是不行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值