C89:论常量(const)
一.Const常量
1.作用
Const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的
用来提高程序的安全性和可靠性(其实我一般都觉得可加可不加,但是加了代码当然更好啦)
它推出的初始目的是为了取代预编译指令,因为const定义的常量在程序运行中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝
非Const类型可以赋值给Const类型,而Const类型不能赋值给非Const类型
Const修饰的数据类型必须赋初值
2.修饰内置类型变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //(1)基本类型 int A; //变量 const int a=1; //常量 a=2; //错误,常量不可变 int const b=2; //常量 b=3; //错误,常量不可变 //(2)指针判断const在*左边还是右边结合 const int * p=&A; //常量数据,变量指针 int const * p=&A; //常量数据,变量指针 p=&a; //正确,变量指针可以变 *p=a; //错误,常量数据不能变 int * const p=&A; //变量数据,常量指针 p=&a; //错误,常量指针不能变 *p=a; //正确,变量数据可以变 const int * const a=&A; //常量数据,常量指针 a=&a; //错误 *a=a; //错误 |
3.修饰函数参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //值传递 void A( const int a){ //因为是两块不同的内存,只能锁定函数内的参数变量内存无法修改 a=3; //错误,无法进行修改 } //引用传递 void A( const int & a){ //引用的原来的数据内存,该内存的值不能变 a=3; //错误,无法进行修改 } //指针传递 void A( const int * a){ //指向的数据不能变,表明该指针无法修改指向内存的值 int b=1; a=&b; //正确,传递进来的指针变量可以变 *a=2; //错误,传递进来的指针变量所指向的值不能变 } //注意:指针传递的本质也是值传递,任何对形参的指针变量的改变都不会影响到实参的指针变量,只有对形参的指针变量所指向的内存进行修改,才会影响到实参的指针变量所指向的内存 void A( int * const a){ int b=1; a=&b; //错误,传递进来的指针变量不能变 *a=2; //正确,传递进来的指针变量所指向的值不能变 } |
4.修饰返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | //值传递 const int a(){} //无意义,返回值加上常量对形参和实参并不会有任何作用和改变 //引用传递 const int & a(){} //会报警告,不建议这么写 //指针传递 const int * A( const int * p){ //用常量指针做返回值,用来接收的指针也必须是常量指针 return p; } int B(){ int data=5; const int * p=&data; p=A(p); //返回常量指针 } int * const A(){...} //无意义,这么写对形参和实参并不会有任何作用和改变 //因为指针变量被返回之后,自身的改变已经无意义,重要的是它指向的内存是不是常量 //注意,非成员函数不允许用const修饰函数 int * A() const {...} //错误,普通函数不能用const进行限定 //注意,const int*无法转换为int*,常量指针无法转换为变量指针 //但是,int*可以转换为const int*,变量指针可以转换为常量指针 |
5.修饰成员函数
注意:const修饰成员函数这个功能只有在C++有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int A() const {} //错误,普通函数无法加上限定符,只能修饰成员函数 class A{ public : //对调用的成员变量和成员函数进行限定 //const修饰的成员函数不能修改任何成员变量(除了mutable修饰的变量) //const修饰的成员函数不能调用非const成员函数,因为非const成员函数会修改成员变量 void a() const ; }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)