C++中const关键字用法总结
2024-09-05 03:13:00
看完了c++ primer的基础篇,对const还是有点陌生,在这里小小地总结一下吧。
1) const与变量
在变量的定义前加上 const
修饰符即可完成const对象的创建。
const int val = 5;
const变量的值不能改变。
val = 5; //error:assignment of read-only variable 'val'
需要注意的是,const变量必须初始化,因为一旦定义了const变量,其值便无法改变,故必须有初始值。
const int val2; //error:uninitialized const 'val2'
默认状态下,const对象仅在文件内有效
//file1.cc
const int val3 = 5;
int val4 = 6;
//file2.cc
//...
extern const int val3;
extern int val4;
cout << val3 << endl; //error:undefined reference to 'val3'
cout << val4 << endl; //ok
如果需要多个文件共享const变量,则只需在其声明和定义前加上关键字 extern
即可。
//file1.cc
extern const int val3 = 5;
int val4 = 6;
//file2.cc
//...
extern const int val3;
extern int val4;
cout << val3 << endl; //ok
cout << val4 << endl; //ok
2) const和指针
const double pi = 3.14; //double常量
double *ptr = π //错误,double指针不能指向const double变量
const double *cptr = π //正确,const double指针也可指向double变量
*cptr = 3.15; //错误,*cptr是const double类型,不能修改
double dval = 3.14;
cptr = &dval; //ok
*cptr = 3.15; //error
int errNumb = 0;
int *const curErr = &errNumb; //const pointer
const double *const pip = π
顶层const表示指针本身是个常量
底层const表示指针所指的对象是一个常量
3) const与函数
void fcn(const int i){//...}
//fcn能够读取i,但不能修改i
函数设计时,对于较复杂的非内置类型应该尽量使用常量引用,值传递会造成不必要的浪费。
void func(string&);
const string str;
func(str);//error
func("something")//error
如上例,如果只是想使用字符串的值,则形参类型应为const string&,否则会限制所能接受形参的类型,并会给人一种误导,即函数可以修改它的实参的值。
4) const与类
使用const限定符修饰类的对象,则在该对象的整个生命周期中,其数据成员永远不会被更改。
const class_name object;
在类的函数成员声明中,如果在参数列表后面加上const,就说明这个函数不能修改对象的任何数据成员(mutable成员除外,其值总是能够被修改),const可以理解为修饰隐式传入函数的this指针。
struct A {
void func() const { val = 0; } //error
private:
int val;
}
最新文章
- 关于firefox对font awesome本地环境无法加载问题
- 利用T-Sql语句中的二重循环打印乘法口诀表
- elk+redis分布式分析nginx日志
- winform中利用反射实现泛型数据访问对象基类(1)
- top N彻底解秘
- C++朝花夕拾【更新】
- EffectiveC#00--选择定义和实现接口,而不是继承
- 原型及原型链,以及prototype和__proto__属性(笔记便于以后复习)
- Holding Bin-Laden Captive!(1.多重背包 2.母函数)
- SoDiaoEditor电子病历编辑器更新至V3版本,愿与各位一路同行!
- StopAllSounds
- ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
- js 使用Math函数取得数组最大最少值
- Springboot中使用Xstream进行XML与Bean 相互转换
- [转帖]Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有
- 【bootstrap组件】几个常用的好用bs组件
- 7.13python多进程
- Python print 中间换行 直接加‘\n’
- 小橙书阅读指南(十三)——连通性算法(union-find)
- node.js执行shell命令
热门文章
- P1025 数的划分——简单题刷傻系列
- linux 网络带宽和延时测试
- codeforces1187E
- 详解css3 pointer-events(阻止hover、active、onclick等触发事件来
- Python读写Excel文件和正则表达式
- 关于JAVA线程池-ThreadPoolExecutor
- Thingsboard学习之一CentOS安装系统更新
- bad object refs/remotes/origin/HEAD
- android: 使用android逆向助手反编译APK
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_18-身份校验-测试