一. const修饰常量

 const用于修饰变量,将变量变为常量(常量一旦定义,就不可以修改)
 编译器在程序的编译时期做的检查

例,已知半径求圆的面积中π\piπ应该是一个常量

 可以采取宏定义的方式,但π\piπ的类型无法指明:

 若采取const定义常量的方式,则可指明π\piπ的类型:

 尝试对const定义的常量进行修改则报错:

二. const修饰指针

 const T∗\ast∗或T const∗\ast∗表示不能修改指针指向的内容,但是指针本身的值是可以修改。(常量指针)(底层const)
 T∗\ast∗ const表示该指针是一个常量,意味指针本身的值不能被修改,但是指针指向的内容可以修改。(指针常量)(顶层const)
 const T∗\ast∗ const表示指针指向的内容及指针本身的值均不能改变。

(记忆口诀:厂底指顶,谁在前谁不能修改)


 情况一,报错:用const修饰指针指向的内容,尝试修改指针指向的内容
 (注意:const T∗\ast∗和T const∗\ast∗写法是等价的)

 情况一,编译通过:用const修饰指针指向的内容,尝试修改指针本身的值

 情况二,报错:用const修饰指针本身的值,尝试修改指针本身的值

 情况二,编译通过:用const修饰指针本身的值,尝试修改指针指针指向的内容


 情况三,报错:用const修饰指针本身的值和指针指向的内容,尝试修改指针本身的值和指针指向的内容

 所以第三种情况是最为严格的情况

——《Effective C++》中文版 Page 17

三. const修饰函数

 const在函数中根据修饰位置分三种:

  const int func(const int a) const ;

  1. 修饰返回值 const int func( ) ; 不能修改返回值。
  2. 修饰函数形参 int func(const int a) ; 函数体内不能修改形参 a 的值。

  3. 修饰类的成员函数 int func( ) const ; 函数体内不能修改成员变量的值,增加程序的健壮性或鲁棒性。(下面的第四小节)

四. const修饰成员函数(常成员函数)和const修饰对象

 作用:无法修改数据成员,一般用来修饰“取,显示,获得数据”的函数
 本质:this 指针的类型:const T∗\ast∗ const
 意义:让编译器提醒开发者该函数不能修改类的成员变量,用于const对象(引用或指针)。

const对象只能调用const成员函数不能调用普通成员函数;

而普通对象既可以调用const成员函数也可以调用普通成员函数。

例:


上例代码:

//小问学编程
#include<iostream>using namespace std;class Point
{public:Point(float a=0,float b=0);void move(float a,float b);//偏移量void print()const;//const成员函数
private:float x;float y;
};Point::Point(float a,float b):x(a),y(b){}void Point::move(float a,float b)
{x+=a;y+=b;
}void Point::print()const{cout<<"("<<x<<","<<y<<")";}int main()
{const Point p(2,2);//const对象p.print();  //正确p.move(1,1);//错误return 0;
}

const关键字的作用总结:

 1. const定义常量 const float pi=3.14 ;其值不能被改变。(注:const常量在定义的时候就必须同时赋好值)

 2. const与指针 常量指针和指针常量。

 3. const与函数

  const int func(const int a) const ;

  a. 修饰形参时,形参不能被修改。

  b. 修饰成员函数时,函数体内不能修改成员变量的值。

 4. const对象

  const Point p ; 常量对象

  a. const对象只能调用const成员函数,不能调用普通成员函数。

  b. 普通对象既可以const成员函数也可以调用普通成员函数。

——《Effective C++》中文版 Page 26

C++之const关键字探究相关推荐

  1. C++之static关键字探究

    一. 静态局部变量和静态全局变量   用一个C语言的简单例子来说明:     总结:   1. 静态局部变量储存在静态储存区:   2. 静态局部变量在函数结束后内存空间不会被回收,下一次调用函数时使 ...

  2. c++中的const关键字

    1.const的符号表机制探究 c语言中的const是一个冒牌货,c++中的const才是一个真正的常量.原因分析:c语言中的const将重新分配一块内存空间.c++编译器对const关键字做了特殊处 ...

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

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

  4. c++语言关键字大全,C++语言const 关键字使用方法图文详解

    之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点.知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自 ...

  5. C语言之头文件,static与const关键字

    [前言] 最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考.平时也都是用印象笔 ...

  6. C 语言编程 — const 关键字

    目录 文章目录 目录 const 关键字 修饰常量 修饰指针 修饰函数形参 修饰函数返回值 const 关键字 const 是 Constant(常量)的简写,有 3 大作用: 修饰常量,说明该常量的 ...

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

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

  8. 【C 语言】const 关键字用法 ( 常量指针 - const 在 * 左边 - 修饰数据类型 - 内存不变 | 指针常量 - const 在 * 右边 - 修饰变量 - 指针不变 )

    文章目录 一.const 普通用法 二.常量指针 ( 指向 常量 的指针 | 被指向的内存不能被修改 ) 三.指针常量 ( 指针不能被修改 ) 三.指向 常量 的 指针常量 四.const 在 * 左 ...

  9. C/C++ static和const关键字的作用

    static关键字至少有下列n个作用: (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)在模块内的stat ...

最新文章

  1. ABAP性能实例七例
  2. 修改CentOS yum源
  3. reporting services 导出pdf格式优化
  4. java for 嵌套_Java中的for循环嵌套
  5. POJ2891 Strange Way to Express Integers【扩展中国剩余定理】
  6. php页面调用时间戳,php--------获取当前时间、时间戳
  7. 华大 MCU 之五 SPI 从机 DMA 模式 配置(不能正常接收问题处理)
  8. Python with...as... 语法深入解析
  9. access和python哪个难学-access和python学哪个好一点
  10. 串口服务器应用领域及应用方案详解
  11. linux下计算目录文件和,统计Linux 中文件和文件夹/目录的数量(示例代码)
  12. Elasticsearch查询速度为什么这么快?
  13. Cloudera Manager Agent 的 Parcel 目录位于可用空间小于 5.0 吉字节 的文件系统上。 /opt/cloudera/parcels(可用:5.0 吉字节 (12.74%)
  14. 模板方法模式--我们一起下饺子
  15. 2020-12-22 ACM集训一(二维数组与结构体)
  16. 虚幻商城人物替换默认小白人(不同骨骼模型人物公用一套动画)
  17. 网易云音乐 2.1.0
  18. speex进行音频去噪
  19. Java贪吃蛇暂停怎么做_Java实现贪吃蛇游戏(1小时学会)
  20. 文献综述怎么写 ,一直没头绪写不出来怎么办?

热门文章

  1. 基于JAVA+SpringMVC+Mybatis+MYSQL的学校教务查询系统
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的宠物商城管理系统
  3. 洛谷 P1080 国王游戏
  4. 利用.NET绘图技术制作水晶按钮控件(转)
  5. jQuery 历史版本
  6. Java 8 函数接口详细教程
  7. python spacy [E050] Can't find model 'en_core_web_sm'
  8. DesiredCapabilities内容详解(摘)
  9. Network in Network----Global Average Pooling
  10. [bzoj] 1257 余数之和sum || 数论