const(C++ primer学习笔记)

本文深入解析C++中const关键字的使用,包括定义常量变量、常量引用、指向常量的指针及常量指针的概念与应用。强调了const在确保代码安全性和提高效率方面的作用。

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

const 定义常量变量

const int bufsize = 512; // const变量必须被初始化;

将变量定义成常量只需在定义前加关键词const。变量一旦被定义成常量,该变量被称为常量变量,变量值不能再被更改,所以变量在被定义时就必须被初始化。任何更改常量对象值的操作都是非法的,包括直接对对象的赋值操作和通过引用,指针对对象的间接赋值操作。编译器会在编译阶段将用到常量变量的地方都换做对应的值。

const 的引用(对常量的引用,常量引用)

首先我们先说一下引用。首先看一下引用的代码:

int ci1 = 1024; // 定义一个int型变量
int &r1 = ci1;  // 在r1变量前加一个'&',声明r1是对ci的引用

代码中ci1是对象,r1就是对ci1的引用。引用相当于对被引用对象起了个别名,对引用的所有操作与对被引用对象直接操作是完全一样的。

r1 = 512; // 对r1的赋值相当于直接对ci赋值
// 跟如下代码是一样的
ci1 = 512;

原因是引用只是给对象起了个别名,相当于同一块内存空间,以前是叫ci1,现在又给它起了个名字叫r1,这样我们通过ci1和r1都可以访问到这块内存空间。
然后我们再看一下对常量的引用,代码如下:

const int ci2 = 1024; // 定义常量整型变量ci2
const int &r2 = ci2;  // 定义对常量整型对象的引用r2

以上我们定义了一个常量整型变量ci2,又定义了对常量的引用r2。需要注意三点:

  1. 对常量的引用不能被用作修改它所绑定的对象
r2 = 512; // 错误:r2是对常量的引用,不能被用来修改ci2的值。

想一想如果我们能够对常量的引用赋值会如何?我们知道,对常量的引用赋值就相当于对被引用对象赋值,所以对r2的赋值相当于对ci2的赋值,而ci2是常量,它的值不能被修改,所以对常量的引用就会导致错误。
2. 非常量引用不能指向常量对象

int &r3 = ci2; //错误:r3是非常量引用,不能指向常量对象ci2

如果r3能够指向ci2会如何呢?假如r3能够指向ci,因为r3是对整型的引用,所以可以对r3赋值,而对r3的赋值相当于对常量变量ci2的赋值,这与常量对象值不能被修改矛盾。所以为了避免这种现象的发生,C++语法也就规定了不能用非常量引用指向一个常量对象。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
3. 常量引用可以指向非常量对象

int i = 1024;
const int &r4 = i; // 常量引用指向非常量对象

常量引用既可以指向常量对象,也可以指向非常量对象。不管是指向常量对象还是非常量对象,常量引用都不能更改被引用对象的值。

// 不能通过r4更改i的值,但i值可以被更改
int i = 42;
const int & r4 = i;
r4 = 20; // 错误:r4是对常量的引用,不能通过r4更改被引用对象的值
i = 20; //正确:i不是常量,可以被直接赋值

指向常量的指针&常量指针

对于引用,指向常量的引用和常量引用是一回事,但对于指针,指向常量的指针和常量指针是完全不同的两个概念。下面分别介绍。

指向常量的指针

指向常量的指针是指,一个指针指向了一个常量对象,该指针不是常量,因此指针的值(指针存放的地址)可以被改变,而指针所指向的对象是个常量,因此不能被修改。

// 指向常量的指针定义
const int ci2 = 1024; // 定义常量对象
const int *r5 = &ci2;   // r5是指向常量的指针

指向常量的指针同样不能更改对象的值,但因为没规定指针是常量,因此指针的值可以被改变,即指针可以指向其他对象,指向其他对象后,同样不能用该指针更改新对象的值。

常量指针

int ci1 = 1024;
int *const r6 = &ci1; // r6是常量指针

常量指针是指指针本身是一个常量,即指针一旦指向某个对象后就将一直指向该对象,不能再指向其他对象,为什么呢?因为指针的值存放的是对象的地址,地址不能被修改,因此指针将一直指向一个对象。因为常量指针只规定了指针是常量,没说它所指向的对象是常量,因此可以通过该指针更改对象的值。

int ci3 = 512;
r6 = &ci3; // 错误:r6是常量指针,其值不能被修改
*r6 = ci3; // 正确:r6是常量指针,不是指向常量的指针,可以通过指针修改指向对象的值

指向常量的常量指针

将常量指针指向一个常量对象就是指向常量的常量指针,可以被定义如下:

const int ci2 = 1024;
const int *const r7 = &ci2;

指向常量的常量指针本身是常量,因此指针的值(指向对象的地址)不能被改变,又因为指向的对象是常量,因此不能通过指针更改对象的值。

总结

本文主要讲解了用const定义常量对象,对常量的引用以及指向常量的指针与常量指针等知识。值得注意的是,指向常量的指针和对常量的引用不能用来更改对象的值,但它们不能更改对象的值不表示对象的值不能通过其他方式更改,对象的值能不能更改取决于对象是不是常量。

内容概要:本文档详细介绍了基于MATLAB实现的无人机三维路径规划项目,核心算法采用蒙特卡罗树搜索(MCTS)。项目旨在解决无人机在复杂三维环境中自主路径规划的问题,通过MCTS的随机模拟与渐进式搜索机制,实现高效、智能化的路径规划。项目不仅考虑静态环境建模,还集成了障碍物检测与避障机制,确保无人机飞行的安全性和效率。文档涵盖了从环境准备、数据处理、算法设计与实现、模型训练与预测、性能评估到GUI界面设计的完整流程,并提供了详细的代码示例。此外,项目采用模块化设计,支持多无人机协同路径规划、动态环境实时路径重规划等未来改进方向。 适合人群:具备一定编程基础,特别是熟悉MATLAB和无人机技术的研发人员;从事无人机路径规划、智能导航系统开发的工程师;对MCTS算法感兴趣的算法研究人员。 使用场景及目标:①理解MCTS算法在三维路径规划中的应用;②掌握基于MATLAB的无人机路径规划项目开发全流程;③学习如何通过MCTS算法优化无人机在复杂环境中的飞行路径,提高飞行安全性和效率;④为后续多无人机协同规划、动态环境实时调整等高级应用打下基础。 其他说明:项目不仅提供了详细的理论解释和技术实现,还特别关注了实际应用中的挑战和解决方案。例如,通过多阶段优化与迭代增强机制提升路径质量,结合环境建模与障碍物感知保障路径安全,利用GPU加速推理提升计算效率等。此外,项目还强调了代码模块化与调试便利性,便于后续功能扩展和性能优化。项目未来改进方向包括引入深度强化学习辅助路径规划、扩展至多无人机协同路径规划、增强动态环境实时路径重规划能力等,展示了广阔的应用前景和发展潜力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值