const关键字
来源:互联网 发布:淘宝试客联盟 编辑:程序博客网 时间:2024/06/15 09:15
在C语言中,我们习惯用#define来定义常量(#define PI 3.14),但是呢,这个常量没办法给它指定类型。学习C++后,它提供了一种更灵活更安全的方式来定义常量,即使用const修饰符来定义(例如:const float PI=3.14;).总之,不论在c语言还是c++里const还是比较常见的一种修饰符,那么接下来我们就详细谈谈const有哪些作用及使用方法。
一.1.用const定义常量
(1)定义基本数据类型
格式:const 类型 常量名=表达式;或 类型 const 常量名=表达式;
例如:const float PI=3.14;
说明:定义常量后,值不能改变
(2)定义常量数组
格式:const 类型 数组名[元素个数]={初值表};
或 类型 const 数组名[元素个数]={初值表};
例如:const int a[5]={0,1,2,5,4};
说明:定义常量数组后,数组元素的值不能改变
2.与指针一起使用
(1)const修饰指向常量的指针
例如:const char* name=“chen”;(表示定义了一个指向常量“chen”的指针变量)
在这里,name可以随意改变值(name=“liu”),但是这个地址里面保存的值是不能改变的,就比如说,门牌号可以换,但是里面的人还是原来的人,不改变。
总之,const修饰指向常量的指针,地址可改变,值不能变
(2)const修饰的常指针
例如:char* const name=“chen”;
这里表示指针name是一个常量,它不能指向另一个字符串,也就是说,地址不可改变,但是里面的值可以更换。
(3)指向常量的常指针
例如:const char* const name=“chen”;
表示指针的指向(即地址)不能改变,同时所指地址中的内容也不能改变。
二.有关const及引用
下来看几种情况:
(1)const int n=10;
int &refn=n; //错误,将“int &”类型的引用绑定到“const int”初始值设定项时,限定符被丢弃。
(2)int m=10;
const int &refm=m; //正确
m=11; //m改变,refm也跟着改变
refm=12; //错误,不能给常量赋值
(3)int &refn=5; //错误,原因是非常量引用的初始值必须为左值
const int &refn=5; //正确 ,常量具有常性,只有常引用可以引用常量
(4)double d1=1.2;
int &refd1=d1; //错误,无法用double类型的d1初始化int&类型的引用
(5)double d1=1.2;
const int &refd1=d1; //正确,refd1进行了隐式类型的转换,但是从double转换到const int可能会造成数据的丢失.
三.在c++中,const修饰类的数据成员,这里需要注意个问题:
数据成员被const修饰后称其为常数据成员,构造函数只能通过初始化列表对其进行初始化,而且任何其他函数都不能对该成员赋值。
下面用一组代码加强理解:
四.const修饰成员函数
在成员函数后面加const,const修饰this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会被改变。
看看以下几种情况:
1. const对象可以调用非const成员函数和const成员函数吗?
答案是:const对象不可以调用非const成员函数,但可以调用const成员函数.
2. 非const对象可以调用非const成员函数和const成员函数吗?
答案是:可以.
3. const成员函数内可以调用其它的const成员函数非const成员函数吗?
答案是:const成员函数内可以调用其它的const成员函数,但不能调用非const成员函数.
4. 非const成员函数内可以调用其它的const成员函数非const成员函数吗?
答案是:可以.
从上面的几个问题中,我们可以得出const的权限只能缩小,不可放大.
下面我们通过一组代码继续说明这个问题:
关于const修饰符目前就整理这么些,希望进一步学习后有更好的补充。
- const关键字
- const关键字
- const关键字
- 关键字const
- const关键字
- const关键字
- const关键字
- const 关键字
- 关键字 const
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- 关键字 const
- const关键字
- Json分层遍历解析聚合数据外汇牌价——对象套数组再套数组再套对象
- Mysql之触发器
- Android样式的开发:shape篇
- SQL数据库的基本操作
- 架构漫谈(二):认识概念是理解架构的基础
- const关键字
- 深入分析 iBATIS 框架之系统架构与映射原理
- B - Babelfish
- fbiz和应用服务器结合
- 未能加载文件或程序集“xxx”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集
- 线程问题
- iOS GitHub Top 100 简介
- Android正则表达式(shou手机与身份证)
- #1038 : 01背包