news 2026/3/1 5:35:49

15. const

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
15. const

1.基础用法

2.核心难点: const 修饰指针

3.const 修饰函数参数

4.const 修饰类成员函数

5.const 修饰函数返回值


1.基础用法

最基础的用途是定义"只读变量",本质是带类型的常量,相比C语言的#define有明显优势,有类型检查、遵守作用域规则
#include <iostream>usingnamespacestd;intmain(){// 定义const常量,必须初始化(一旦定义不可修改)constintMAX_SIZE=100;// MAX_SIZE = 200; // 错误!编译器会直接报错:不能修改const变量// 对比#define(无类型检查,预处理阶段直接替换)#definePI 3.14159// PI = 3.14; // 错误,但报错原因是“赋值给常量”,而非类型问题cout<<"MAX_SIZE: "<<MAX_SIZE<<endl;cout<<"PI: "<<PI<<endl;return0;}
a.const常量必须在定义时初始化(因为后续无法修改)b.const常量有明确的类型(int/double),编译器会做类型检查,而#define只是文本替换,无类型 c.const常量遵守作用域(比如局部const只在函数内生效),#define是全局生效(直到#undef)

2.核心难点: const 修饰指针

const修饰指针有三种常见场景,核心是区分"指向的内容不可改""指针本身不可改"

#include <iostream>usingnamespacestd;intmain(){inta=10,b=20;// 场景1:const int* p(指向常量的指针)constint*p1=&a;// *p1 = 100; // 错误:不能修改指向的内容p1=&b;// 正确:指针本身可以指向其他地址// 场景2:int* const p(常量指针)int*constp2=&a;*p2=100;// 正确:可以修改指向的内容// p2 = &b; // 错误:指针本身不能指向其他地址// 场景3:const int* const p(都只读)constint*constp3=&a;// *p3 = 100; // 错误// p3 = &b; // 错误cout<<"a: "<<a<<endl;// 输出:100return0;}


3.const 修饰函数参数

const修饰函数参数的核心目的是:"防止函数内部意外修改传入的参数, 尤其适合大对象(如字符串、类对象)结合引用使用"
#include <iostream>#include <string>usingnamespacestd;// const修饰普通参数(值传递):意义不大(因为参数是拷贝,修改不影响原变量)voidprintNum(constintnum){// num = 100; // 错误:不能修改const参数cout<<"Num: "<<num<<endl;}// const修饰引用参数(重点):避免拷贝+防止修改原对象voidprintStr(conststring&str){// str = "hello"; // 错误:不能修改const引用的内容cout<<"Str: "<<str<<endl;}intmain(){printNum(5);printStr("world");return0;}

4.const 修饰类成员函数

const放在类成员函数的末尾,表示:"该函数不会修改类的任何成员变量(除非成员变量被mutable修饰), 只能调用其他const成员函数"
#include <iostream>usingnamespacestd;classPerson{private:stringname;mutableintage;// mutable:即使在const函数中也能修改public:Person(stringn,inta):name(n),age(a){}// const成员函数:不能修改普通成员变量stringgetName()const{// name = "Tom"; // 错误:不能修改非mutable成员age=20;// 正确:mutable成员可以修改returnname;}// 普通成员函数:可以修改所有成员voidsetName(stringn){name=n;}};intmain(){constPersonp("Jerry",18);// const对象// p.setName("Bob"); // 错误:const对象只能调用const成员函数cout<<p.getName()<<endl;// 正确:调用const成员函数return0;}

5.const 修饰函数返回值

const修饰返回值的核心目的是:"防止返回值被意外修改, 常见于返回指针/引用的场景"
#include <iostream>usingnamespacestd;// 返回const int:防止返回值被修改(值传递意义不大)constintadd(inta,intb){returna+b;}intmain(){intres=add(3,5);// 正确:可以赋值给普通变量// add(3,5) = 10; // 错误:不能修改const返回值cout<<res<<endl;// 输出:8return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 12:06:41

突破60帧限制:Genshin FPS Unlocker 7大核心技术与实战配置指南

突破60帧限制&#xff1a;Genshin FPS Unlocker 7大核心技术与实战配置指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 高帧率游戏体验的技术痛点与解决方案 为什么《原神》玩家普遍…

作者头像 李华
网站建设 2026/2/23 15:22:39

智谱AI GLM-Image体验报告:Web界面生成高清艺术图

智谱AI GLM-Image体验报告&#xff1a;Web界面生成高清艺术图 你有没有试过这样的情景&#xff1a;脑子里浮现出一幅画面——“月光下的青瓷茶盏&#xff0c;釉面泛着幽蓝微光&#xff0c;旁边散落几片银杏叶&#xff0c;背景是宋代水墨屏风”——可翻遍图库找不到&#xff0c…

作者头像 李华
网站建设 2026/2/28 18:06:52

Janus-Pro-7B新手入门:3步完成Ollama部署与简单调用

Janus-Pro-7B新手入门&#xff1a;3步完成Ollama部署与简单调用 1. 为什么Janus-Pro-7B值得你花5分钟试试&#xff1f; 你有没有遇到过这样的情况&#xff1a;想让AI看懂一张产品图并生成营销文案&#xff0c;或者上传一张设计草图让它描述细节、提出优化建议&#xff1f;传统…

作者头像 李华
网站建设 2026/2/28 1:03:39

G-Helper:华硕笔记本轻量级性能控制工具效率提升实测

G-Helper&#xff1a;华硕笔记本轻量级性能控制工具效率提升实测 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址…

作者头像 李华
网站建设 2026/2/24 15:15:16

Unity游戏本地化:Hunyuan-MT 7B多语言资源生成方案

Unity游戏本地化&#xff1a;Hunyuan-MT 7B多语言资源生成方案 1. 游戏出海卡在翻译这道坎上 上周和一个做独立游戏的朋友聊天&#xff0c;他刚把一款像素风RPG上架Steam&#xff0c;中文版上线三天就卖了两百多份。可当他点开后台的销售数据&#xff0c;发现欧美区的转化率只…

作者头像 李华