C++中const关键字的使用总结
const是不变的意思,在C++程序中,经常用const来限制对一个对象的操作:
1.1 const变量
例如: const int n=3; 则这个变量的值不能改变,即不能对变量赋值。
1.2 const参数
出现在函数参数中的const表示在函数体中不能对这个参数做修改。比如strcmp()函数用来比较两个字符串的大小,在函数体中不应该改变两个的参数的值,所以将它定义为是const的。const通常用来限制函数的指针参数、引用和数组参数,而一般形式的参数因为形式参数和实参本来就不在同一个内存空间,所以对形式参数的修改不影响实在参数,因此也没有必要限制函数不能对参数进行修改。
下面是一些使用函数const参数的例子:
(1)函数strcpy()将src字符串的内容复制到targ字符串中,为保证src字符串不被修改,将它定义问const参数:
void strcpy(const char* src,char * targ);
(2)函数max() 从数组array中找出具有最大值的数组元素并返回这个最大元素的值,为保证数组元素不会再函数中被修改,将它定义为const参数:
int max(const int array[] ,int size);
(3)函数outputOjbect()将类MyClass的对象obj的内容输出。对象定义为const引用,即可以保证对象不会在函数体中所改变,又可以节省对象传递的开销,如:
void outputObject(const MyClass & obj);
1.3 const 返回值
函数返回值为const只有用在函数返回为引用的情况。函数返回值引用常量表示不能将函数调用表达式作为左值使用。
例如:
int &min(int &i,int &j); 可以对函数调用进行赋值,因为它返回的是左值: min(a,b)=4;
但是,如果对函数的返回值限定为const的:
const int &min(int &i , int &j); 那么,就不能对min(a,b)调用进行赋值了。
1.4 const 函数
在学到类时,将会看到可以为类的成员函数进行如下形式的定义:
calss classname{
public :
int getMember() const;
private :
int member;
};
这里,在函数定义头后面加上的const表示这个函数是一个“只读函数”,函数不能改变类对象的状态,不能改变对象的成员变量的值。如在函数体中不能这么写:
classname::getMember()
{
member=4; //错误!不能修改成员变量的值
return member;
}
1.5 用const 来限制指针
1).指向常量的指针:
当const出现在指针定义的最开始时,表示定义了一个指向常量的指针。比如:
int i; const int ci=20;
const int * ip1=&ci; const int * ip2=&i;
这里定义了两个指向常量的指针,ip1和ip2。并且ip1初始化为指向一个常量ci,ip2初始化为指向一个变量i。
指向常量的指针的含义是:不能用过指针来间接修改指针所指向内存空间的值。比如上面的例子就不能通过*ip1来修改常量ci的值,也不能通过*ip2来修改变量i的值,所以下面的语句不正确:
*ip1=34; //错误! ip1是指向常量的指针
*ip2=54; //错误! ip12是指向常量的指针
在使用指向常量的指针时,应该注意以下几点:
a).指向常量的指针只限制指针的间接访问操作,而不会限制指针变量本身的操作。所以,可以改变指针本身的值。比如可以修改ip1和ip2的值:ip1=&i; ip2=&ci;
b).指向常量的指针只限制指针的间接访问的操作,但不会限制所指向的空间的操作。比如指针ip指向一个变量i:
int i; const int * ip=&i;
*ip=34; //错误! ip是指向常量的指针
i=56; //正确,i是一个变量
c).如果要给一个指针赋一个常量的地址,则这个地址必须定义成指向常量的指针。这样可以保证不会通过指针来间接修改常量的值。比如:
const int ci=30; //正确!
const int* ip1=&ci; //错误! 必须将ip2定义成指向常量的指针
ci是一个常量,如果要将它的地址赋值给一个指针,这个指针必须是一个指向常量的指针。所以不能将一个不指向常量的指针ip2指向常量ci.
2). 指针常量
在定义指针的时候,可以通过在指针名的前面加上const来将指针定义成常量,称为指针常量。和一般的常量一样,我们不能修改指针常量的值。即我们只能在定义指针时将它初始化为指向某个地方,不能再对指针赋值。下面是对指针常量的定义:
int i,j;
int * const ip=&i; //正确!定义指针常量ip,初始化为指向变量i
ip=&j; //错误!不能改变指向常量的值
注意,对指针变量的const限制并不影响对它所指向空间的操作。可以通过间接引用来操作符‘*’来修改指针所指向的空间值。例如上面定义的指针常量ip指向变量i,可以通过*ip来改变i 的值: *ip=32; //正确!
3). 指向常量的指针常量
如果将上面两个结合起啦,就可以定义指向常量的指针常量。下面定义了这么一个指针:
const int ci=93;
const int * const pi=&ci;
指向常量的指针常量必须在定义时初始化,它的使用也非常受限制,我们不能改变指针本身的值,也不能通过指针来间接改变指针,只能在程序中使用它们的值。
上面介绍了利用const来限定指针的三种情况。需要记住的是,指针本身和指针所指向的空间是两个不同的内存空间,所以需要对两者分别限定。
C++中const关键字的使用总结相关推荐
- C++中const关键字用法详解及实例和源码下载(一)
最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识.现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲 ...
- c++语言const是什么意思,c++中const关键字
c++中const关键字 const是一个C++语言的限定符,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.下面是小编分享的c++中const关键字,一起来看一下 ...
- C/C++中const关键字的用法及其与宏常量的比较
1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 1 const int a = 10; 2 int const b = 2 ...
- c语言常量折叠,C/C++中const关键字相关
const 本文根据<C和指针>3.4节,<C专家编程>1.9节以及相关网络资源整理总结const三个不易理解的地方: 声明,函数参数赋值,存储类型.如有偏误,欢迎指正,共同学 ...
- ES6中 const 关键字
const声明一个只读的常量.一旦声明,常量的值就不能改变. 定义后可以使用但不能修改 但是,const 定义的对象可能与我们想象的不太一样 定义了对象b ,我们可以在b上添加修改属性,再看一个列子 ...
- final关键字_Dart核心语言基础const关键字与final关键字的区别
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼搏过,尽力过,一切问心无愧 本文描述 Dart 中 const 关键字与 final 关键字的基本使用知识点以及对比区别. Dart核心基 ...
- C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))
内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...
- Dart核心语言基础const关键字与final关键字的区别
题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 本文描述 Dart 中 const 关键字与 final 关键字的基本使用知识点以及对比区别 ** 你可能需要 ...
- C++中的const关键字(zz)
[补充]mutable关键字 有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现.这样的应用,比如记录各种操作的调用次数,这时,即使在co ...
最新文章
- python 网盘多帐号_CuteOne:一款基于Python3的OneDrive多网盘挂载程序,带会员/同步等功能...
- Windows Phone 7 Image Controller: Zoom In, Zoom Out, and Rotate (WP 7 图像控制器:放大,缩小,旋转)...
- rsync+shell脚本完成自动化
- (20):数据的准备工作
- 电脑换ip_代理ip地址怎么换
- DataX在数据迁移中的应用
- 网络编程(part3)--文件读写之二进制文件读写/with操作
- 复制带随机节点的链表
- CMOS Sensor的调试经验分享(转)
- 深度学习笔记(8) 实践层面(三)
- mybatis注解开发_Spring Boot 中集成 MyBatis
- StopWatch工具
- excel文件占用空间大 xls xlsx等文件
- java 过滤器filter使用案例
- docx4j学习笔记
- 国家2000坐标系的理解
- 【翻译】Real-Time High-Resolution Background Matting
- QQ微信等分享链接时系统提取的标题和图片代码
- odoo15 tree kanban顺序调整,显示及打开顺序
- 《Python深度学习》3.4电影评论分类:二分类问题
热门文章
- java nginx https_docker nginx 配置ssl,实现https
- 蓝桥杯评分标准_蓝桥杯比赛要求
- macbook pro python开发_Mac打造python2 python3开发环境
- linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist
- 在linux下赋予000权限,【linux】对于文件权限的理解
- echarts 卡_图表太丑怎么破,ECharts神器带你飞!
- 如何玩转CSS的Id 和 Class选择器?
- fofa自动化爬虫脚本更新+详解
- matlab短均线滞后项,均线理论的滞后性问题
- java httpserver 多个接口_多个Servlet之间数据共享实现方案