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关键字的使用总结相关推荐

  1. C++中const关键字用法详解及实例和源码下载(一)

    最近在学习C++基础部分,看了两天书,已经看过了一遍,半知半解,回过头来重新看第二遍,深入了解一下C++的基础知识.现在读到了const关键字的用法,书上面讲解的时候并没有给出完整的实例,只是理论的讲 ...

  2. c++语言const是什么意思,c++中const关键字

    c++中const关键字 const是一个C++语言的限定符,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性.下面是小编分享的c++中const关键字,一起来看一下 ...

  3. C/C++中const关键字的用法及其与宏常量的比较

    1.const关键字的性质 简单来说:const关键字修饰的变量具有常属性. 即它所修饰的变量不能被修改. 2.修饰局部变量 1 const int a = 10; 2 int const b = 2 ...

  4. c语言常量折叠,C/C++中const关键字相关

    const 本文根据<C和指针>3.4节,<C专家编程>1.9节以及相关网络资源整理总结const三个不易理解的地方: 声明,函数参数赋值,存储类型.如有偏误,欢迎指正,共同学 ...

  5. ES6中 const 关键字

    const声明一个只读的常量.一旦声明,常量的值就不能改变. 定义后可以使用但不能修改 但是,const 定义的对象可能与我们想象的不太一样 定义了对象b ,我们可以在b上添加修改属性,再看一个列子 ...

  6. final关键字_Dart核心语言基础const关键字与final关键字的区别

    题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼搏过,尽力过,一切问心无愧 本文描述 Dart 中 const 关键字与 final 关键字的基本使用知识点以及对比区别. Dart核心基 ...

  7. C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))

    内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...

  8. Dart核心语言基础const关键字与final关键字的区别

    题记:不到最后时刻,千万别轻言放弃,无论结局成功与否,只要你拼博过,尽力过,一切问心无愧 本文描述 Dart 中 const 关键字与 final 关键字的基本使用知识点以及对比区别 ** 你可能需要 ...

  9. C++中的const关键字(zz)

    [补充]mutable关键字 有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现.这样的应用,比如记录各种操作的调用次数,这时,即使在co ...

最新文章

  1. python 网盘多帐号_CuteOne:一款基于Python3的OneDrive多网盘挂载程序,带会员/同步等功能...
  2. Windows Phone 7 Image Controller: Zoom In, Zoom Out, and Rotate (WP 7 图像控制器:放大,缩小,旋转)...
  3. rsync+shell脚本完成自动化
  4. (20):数据的准备工作
  5. 电脑换ip_代理ip地址怎么换
  6. DataX在数据迁移中的应用
  7. 网络编程(part3)--文件读写之二进制文件读写/with操作
  8. 复制带随机节点的链表
  9. CMOS Sensor的调试经验分享(转)
  10. 深度学习笔记(8) 实践层面(三)
  11. mybatis注解开发_Spring Boot 中集成 MyBatis
  12. StopWatch工具
  13. excel文件占用空间大 xls xlsx等文件
  14. java 过滤器filter使用案例
  15. docx4j学习笔记
  16. 国家2000坐标系的理解
  17. 【翻译】Real-Time High-Resolution Background Matting
  18. QQ微信等分享链接时系统提取的标题和图片代码
  19. odoo15 tree kanban顺序调整,显示及打开顺序
  20. 《Python深度学习》3.4电影评论分类:二分类问题

热门文章

  1. java nginx https_docker nginx 配置ssl,实现https
  2. 蓝桥杯评分标准_蓝桥杯比赛要求
  3. macbook pro python开发_Mac打造python2 python3开发环境
  4. linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist
  5. 在linux下赋予000权限,【linux】对于文件权限的理解
  6. echarts 卡_图表太丑怎么破,ECharts神器带你飞!
  7. 如何玩转CSS的Id 和 Class选择器?
  8. fofa自动化爬虫脚本更新+详解
  9. matlab短均线滞后项,均线理论的滞后性问题
  10. java httpserver 多个接口_多个Servlet之间数据共享实现方案