聊聊C++关键字const

博主面试被问const关键字未答全,遂恶补后分享。介绍了const变量和对象的初始化、多文件共享,const引用、指针,顶层和底层const区别,constexpr与常量表达式,const形参和实参,以及const修饰函数等内容,有助于提升对const的理解。

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

面试的时候被问到const关键字,我只说出了几条,没说全,感觉面试官很不满意,回去就恶补了一下,现在跟大家分享一下:
(1)const变量和对象一旦定义就不能改变,故必须初始化
(2)默认状况下,const对象只在文件内有效。如果想在多个文件共享const对象就必须在变量定义前加extern关键字
(3)const的引用:把引用绑定到const上就像绑定到其他对象上一样,称之为对常量的引用。与普通引用不同的是对常量的引用不能被用作修改他所绑定的对象

const int ci=1024;
const int &r1=ci;
r1=42;//错误,r1是对常量的引用
int &r2=ci;//错误:试图让非常量引用指向一个常量对象

(4)对const的引用可能引用一个非const的对象:

int i=42;
int &r1=i;//引用r1绑定对象i
const int &r2=i;//r2也绑定对象i,但不允许通过r2修改i的值,却可以通过r1修改i的值
r1=0;
r2=0;//错误,r2是一个常量引用

(5)指针和const:
指针是对象而常量不是,因此允许把指针本身定为常量 常量指针必须初始化而且一旦初始化就不能改变其指向。把*放在const前面说明指针是一个常量,即不变得是指针本身得值而非他所指向对象的值。指针本身是一个常量并不意味着不能通过指针修改他所指对象的值,这取决于所指对象的类型,如果所指对象为常量而无法修改。
(6)顶层const和底层const:
顶层const:可以表示任意对象是常量,对任何数据类型都适用
底层const:与引用和指针等复合类型的基本类型部分有关。指针类型既可以是顶层const也可以是底层const,而引用类型只存在底层const

int i=0;
int *const p1=&i;//不能改变p1的值,这是一个顶层const
const int ci=42;//不能改变ci的值,顶层const
const int *p2=&ci;//允许改变p2的值,底层const
const int *const p3=p2;//靠右的const是顶层const,靠左的const是底层const,导致既不能修改p3的值也不能通过p3修改其所指对象的值
const int &r=ci;//用于申明引用的const都是底层const

当执行对象拷贝时顶层const和底层const有区别:
执行对象拷贝时对顶层const不受影响,但对底层const有影响。拷入和拷出的对象必须有相同的底层const资格或两个数据类型可以转换。如:非常量可以转换为常量,反之不行

int *p=p3;//错误,p3包含底层const而p没有
p2=p3;//正确,p2和p3都有底层const
p2=&i;//正确,int *能转换成const int *
int &r=ci;//错误,普通int &不能绑定到int常量上
const int &r2=i;//正确,const int &可以绑定到普通int

(7)constexpr 和常量表达式
C++11新标准规定允许将变量声明为constexpr类型以便编译器来验证变量的值是否是常量表达式。声明为constexpr的变量必须用常量表达式去初始化

constexpr int mf=20;
constexpr int limit=mf+1;//mf+1是常量表达式
constexpr int sz=size();//只有当size()是一个constexpr函数时才正确

指针和constexpr
如果用constexpr定义了一个指针,则限定符仅对指针本身有效,与指针所指对象无关。constexpr把所定义的对象置为顶层const
(8)const形参和实参:
当形参有顶层const时,传递给他常量对象或非常量对象都是可以的。当我们不希望形参在函数中改变时就可以用const修饰形参
(9)const修饰函数:
声明一个成员函数的时候用const关键字是用来说明这个函数是 “只读(read-only)”函数,也就是说明这个函数不会修改任何数据成员(object)。 为了声明一个const成员函数, 把const关键字放在函数括号的后面。声明和定义的时候都应该放const关键字。
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。当const在函数名前面的时候修饰的是函数返回值.

1. 用户与权限管理模块 角色管理: 学生:查看实验室信息、预约设备、提交耗材申请、参与安全考核 教师:管理课题组预约、审批学生耗材申请、查看本课题组使用记录 管理员:设备全生命周期管理、审核预约、耗材采购与分发、安全检查 用户操作: 登录认证:统一身份认证(对接学号 / 工号系统,模拟实现),支持密码重置 信息管理:学生 / 教师维护个人信息(联系方式、所属院系),管理员管理所有用户 权限控制:不同角色仅可见对应功能(如学生不可删除设备信息) 2. 实验室与设备管理模块 实验室信息管理: 基础信息:实验室编号、名称、位置、容纳人数、开放时间、负责人 功能分类:按学科(计算机实验室 / 电子实验室 / 化学实验室)标记,关联可开展实验类型 状态展示:实时显示当前使用人数、设备运行状态(正常 / 故障) 设备管理: 设备档案:名称、型号、规格、购置日期、单价、生产厂家、存放位置、责任人 全生命周期管理: 入库登记:管理员录入新设备信息,生成唯一资产编号 维护记录:记录维修、校准、保养信息(时间、内容、执行人) 报废处理:登记报废原因、时间,更新设备状态为 "已报废" 设备查询:支持按名称、型号、状态多条件检索,显示设备当前可用情况 3. 预约与使用模块 预约管理: 预约规则:学生可预约未来 7 天内的设备 / 实验室,单次最长 4 小时(可设置) 预约流程:选择实验室→选择设备→选择时间段→提交申请(需填写实验目的) 审核机制:普通实验自动通过,高危实验(如化学实验)需教师审核 使用记录: 签到 / 签退:到达实验室后扫码签到,离开时签退,系统自动记录实际使用时长 使用登记:填写实验内容、设备运行情况(正常 / 异常),异常情况需详细描述 违规管理:迟到 15 分钟自动取消预约,多次违规限制预约权限 4. 耗材与安全管理模块 耗材管理: 耗材档案:名称、规格、数量、存放位置、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值