详解const

简介: C++中提供了很多关键字赋予一些东西特殊的函数,比如const、override、final等,本文将从有类和无类两个方面详细介绍const的相关用法于注意事项。剩下的等我这几天加班加点更新吧!

1.无类:

const可以修饰指针,也可以修饰指针指向的内容,还可以修饰引用返回值形式参数等。

(1)修饰指针:int a = 10; int *const p = &a; 表示指针本身不能更改。

 (2)  修饰指针所指向的内容:int a= 10; const int *p = &a; 表示指针指向的内容即对p解引用不能被赋值。但是a本身还是能修改的。

(3)修饰引用:int a = 10; const int& b = a; 表示引用本身不能更改。但是a本身还是可以改的。

(4)修饰返回值,int a = 10; const int& get_int(){ return a;},表示返回值不能充当左值

(5)修饰形式参数:int get_a(int const&a)如果传递一个引用,且这个引用加了const修饰,表示形参不能修改进而无法修改到我实参的值,这种手法也常用于防止无意修改实参产生不可预期的后果。



2.有类:

const放在成员函数参数列表右边可以修饰this指针、也可以修饰成员变量表示我的成员变量为常数据成员,还可以修饰一个对象

(1)修饰this指针:表示指向的内容不能更改即不能修改成员变量,可以改被mutable修饰过的成员变量或者常成员函数(const放到参数列表右边修饰过的成员函数)里定义的局部变量。此时这样的函数叫做常成员函数

(2)修饰成员变量:表示数据成员不能更改。此时这样的成员变量叫常成员变量。

(3)修饰对象:表示对象不能调用非const方法。因为此时这样的方法有更改对象数据成员的风险。此时这样的对象叫常对象。


接下来我们通过一段简短的代码来加深对上述知识的理解。

#include <iostream>usingnamespacestd;
classTest{
public:
voidset_a() const    {
/*a = 20;*/// 报错,const成员函数无法修改成员变量a2=20; // 可以,mutable修饰的成员变量表示我这个变量对于我的对象来说无关紧要你可以去改它    }
voidset_b()
    {
//b = 20; // 报错,const修饰的成员变量不能修改    }
Test() =default;
~Test() =default;
private:
inta1=10;
mutableinta2=10;
constintb=10;
};
constint&get_a1(constint&b) // 修饰形式参数,b不能改,从而保证了a1不会被无意改掉{
returnb;
}
intmain(void)
{
inta1=10;
inta2=20;
int*constp1=&a1; //表示指针本身不能更改//p = &a2; // 试图更改const指针将会报错constint*p2=&a1;
//*p2 = 50; // 试图通过const*指针更改p2所指针指向的内容报错a1=50; // a1自己还是可以改的constint&b=a1;
//b = 50; // 试图通过const引用更改a1的值报错a1=50; // a1自己还是可以改的/*get_a1(a1) = 10; *///报错,const修饰过的返回值类型不能作为左值Testconsttest;
//test.set_b(); //报错,const对象无法调用非const方法,有数据修改的风险return0;
}




相关文章
|
10月前
|
测试技术
软件测试的艺术:探索式测试的实践与思考
在软件开发的广阔海洋中,测试是确保航船稳健行驶的关键。本文将带你领略探索式测试的魅力,一种结合创造性思维和严格方法论的测试方式。我们将一起揭开探索式测试的神秘面纱,了解其核心概念、实施步骤和带来的效益。通过实际代码示例,你将学会如何将探索式测试融入日常的软件质量保证流程中,提升测试效率与质量。
|
消息中间件 Java
SpringBoot RabbitMQ死信队列
SpringBoot RabbitMQ死信队列
243 0
|
前端开发 Dubbo Java
医疗管理系统-项目概述和环境搭建
医疗管理系统-项目概述和环境搭建
409 0
|
存储 运维 安全
【运维知识高级篇】一篇文章带你搞懂GitHub基础操作!(注册用户+配置ssh-key+创建项目+创建存储库+拉取代码到本地+推送新代码到Github)
【运维知识高级篇】一篇文章带你搞懂GitHub基础操作!(注册用户+配置ssh-key+创建项目+创建存储库+拉取代码到本地+推送新代码到Github)
515 0
|
关系型数据库 MySQL 数据库
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
对于mysql数据库delect from,truncate table,drop table, update操作的时候如何选择
519 2
|
4月前
|
人工智能 安全 Go
Go语言中 Mutex 的实现原理
本文深入解析了 Go 中 `sync.Mutex` 的实现原理及其工作机制。`Mutex`(互斥锁)是并发编程中的基础同步机制,用于保护共享资源不被多个 Goroutine 同时访问。Go 的 `sync.Mutex` 通过轻量级的结构体实现,包含 `state` 和 `sema` 两个字段,分别用于表示锁状态和管理 Goroutine 的阻塞与唤醒。 文章详细分析了锁的获取(`Lock()`)和释放(`Unlock()`)过程,包括快速路径和慢速路径的实现逻辑。在慢速路径中,介绍了自旋锁优化、饥饿模式以及信号量机制的应用,确保高效且公平地管理锁竞争。
106 6
|
Prometheus 监控 Kubernetes
Prometheus 在微服务架构中的应用
【8月更文第29天】随着微服务架构的普及,监控和跟踪各个服务的状态变得尤为重要。Prometheus 是一个开源的监控系统和时间序列数据库,非常适合用于微服务架构中的监控。本文将详细介绍 Prometheus 如何支持微服务架构下的监控需求,包括服务发现、服务间的监控指标收集以及如何配置 Prometheus 来适应这些需求。
414 1
|
6月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。
|
7月前
|
机器学习/深度学习 人工智能 API
aliyun评测零门槛、即刻拥有 DeepSeek-R1 满血版
DeepSeek-R1满血版是一款零门槛、高性能的深度学习工具,旨在帮助开发者和研究人员高效实现创新。评测显示,其操作界面设计友好,左右分屏布局使理论与实践紧密结合,极大提升了操作连贯性和效率。用户可轻松获取API-KEY,并通过Chatbox配置进行深度学习对话,整个过程简单流畅。该工具在部署集成性、易用性及高性能计算支持方面表现出色,尤其适合本地软件部署,满足用户的实际需求。阿里云提供的详尽文档和引导也使得初次使用者能快速上手,体验极佳。
204 1
|
9月前
|
机器学习/深度学习 存储 人工智能
智能体首次达到Kaggle Grandmaster水平,华为用结构化推理补齐思维链短板
近日,华为诺亚方舟实验室与伦敦大学学院(UCL)联合开发的智能体Agent K v1.0在Kaggle竞赛中达到Grandmaster水平,引发广泛关注。该智能体采用创新的结构化推理框架,优化长期和短期记忆,动态处理复杂推理任务。通过自动化协议,Agent K v1.0能自动完成数据收集、清理、预处理等任务,并在多种数据模态下取得优异成绩。其Elo-MMR评分位于前38%,获得多枚奖牌,展示了强大的预测和决策能力。这一突破为AI在数据科学领域的应用开辟了新可能,但也需关注其局限性和伦理影响。论文地址:https://arxiv.org/pdf/2411.03562。
235 22