“深入解析”这一词只是为了吸引大家的眼球,这里我主要说说自己的理解。既然是深入解析,那也要有一定的见解才好,不然贻笑大方。

Const顾名思义,就是常量,常量是什么,那就是不能轻易改变,注意是轻易(用const_cast可以强制转化)。我们主要从这几个方面入手解析:#define和const、const指针类型和普通数据类型、普通const函数、类的const成员函数和成员变量。

一、#define。宏是对复杂内容替换以后的简单文本,为了简单易读。typedef常用来定义一个标识符及关键字的别名,就是一个类型的同义。如:#define PI 3.1415926,typedef int A,A就和int是同义词。当然这不是重点,大家都知道(我的毛病就是喜欢把所有关联的知识点放到一起,因为记忆英语单词我也是这么干的)。我们更关心的是#define和const的区别:

  1. 编译器处理方式不同。#define是在预处理阶段展开(编译),const常量是编译运行阶段使用。
  2. 类型和安全检查不同。#define没有类型,没有类型检查,只是简单的展开,const有数据类型,在编译运行阶段检查类型。
  3. 存储方式不同。define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存,const常量会在内存中分配(可以是堆中也可以是栈中)。
  4. const  可以节省空间,避免不必要的内存分配。如程序
    #define M 12.56
    const double cd = 12.54;
    int main()
    {double md = M;double dcd = cd;double md1 = M;double dcd1 = cd;return 0;
    }

    const一开始就分配了内存,而#define没有。 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。

  5. 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。既然这么好,能使用const就使用const。
二、const+数据类型+变量。
const int ci = 2;//定义初始化ci = 3;    //error:ci是const,不能变const double* pd = &dcd; //     和double const* pd = &dcd;一样pd = &md;*pd = M; //Error:指针指向内容const不能变double* const p = &dcd;*p = M;p = &cd; //Error:指针是constconst double* const pcc = &dcd;   //指针和内容都是constpcc = &cd;*pcc = M;

三、普通const函数

a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)

void function(const int Var);

b.参数指针所指内容为常量不可变

void function(const char* Var);

c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)

void function(char* const Var);

d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:

void function(const Class& Var); //引用参数在函数内不可以改变
void function(const TYPE& Var); //引用参数在函数内为常量不可变

不建议const作为函数返回值

四、类的成员函数和成员变量
class test {
public:test(int _a) :a(_a), b(0.12),c(0)/*必须初始化*/{pb = new int[10];}//const成员函数,把const放在函数声明的末尾就可以了,表示该函数无法改变类的数据成员//只能发生读操作,不能发生写操作void init_variable()const{//a = 5;//不可以改变数据成员的值std::cout << a << std::endl;pb[0] = 10;//不能修改指针,但修改指针指向的内容是可以的。std::cout << pb[0] << std::endl;c++; //mutable}void init_variable(){//a = 5;//不可以改变数据成员的值//b = 3.2;//const数据成员变量不能改变std::cout << a << std::endl;std::cout << pb[0] << std::endl;}~test() {delete pb;pb = NULL;}
private:int a;int* pb;const double b;mutable int c;//关键字mutable使得c在const成员函数中也可以改变。
};
int main()
{const test mytest(4);mytest.init_variable();//可以调用const成员函数test test1(6);test1.init_variable();return 0;
}
五、static和const(static理解)
这个看这篇文档就知道了const_static
 好了,写到这里我也对const有了比较深的理解,不知道大家感觉如何。尽量用const。

C++ Const深入解析相关推荐

  1. Const 重载解析

    1. Const重载应用场景 首先,对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参.则这个时候无论加不加const对实参不会产生任 ...

  2. Javascript基础之-var,let和const深入解析(二) - 三者的规范描述、临时死区 (TDZ)、双定义

    文章目录 # var 规范 - 描述 # let 和 const 规范 - 描述 # 临时死区 (TDZ) # 双定义 # 总结 你想在在变量声明之前就使用变量?以后再也别这样做了. 新的声明方式(l ...

  3. Const 深度解析

    面向对象是C++的重要特性. 但是c++在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只 ...

  4. C语言中const用法解析

    const修饰的变量存储位置,和不用const修饰的没区别!!!!!! 转自:http://blog.csdn.net/xingjiarong/article/details/47282255 关键字 ...

  5. c# mvvm模式获取当前窗口_对Vue中的MVVM原理解析和实现

    首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写 下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家可以学习到: 1.Vue数据双向 ...

  6. PostgreSQL 源码解读(160)- 查询#80(如何实现表达式解析)

    本节介绍了PostgreSQL如何解析查询语句中的表达式列并计算得出该列的值.表达式列是指除关系定义中的系统列/定义列之外的其他投影列.比如: testdb=# create table t_expr ...

  7. Boost学习之语法解析器--Spirit

    Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...

  8. mysql源代码解析经典类——THD类

    1.1 线程类THD概述 对于每个客户端连接,我们使用THD作为线程/连接描述符创建一个单独的线程. 1.2 位置 #include <sql_class.h> 嵌套类 //表示只读可连接 ...

  9. vue指令写在html中的原理,详解Vue中的MVVM原理和实现方法

    对Vue中的MVVM原理解析和实现首先你对Vue需要有一定的了解,知道MVVM.这样才能更有助于你顺利的完成下面原理的阅读学习和编写下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家 ...

最新文章

  1. Linux shell 学习笔记(7)— 构建基本脚本(变量、重定向、管道、状态码)
  2. 从15000个Python开源项目中精选的Top30,Github平均star为3707,赶紧收藏!
  3. 「Web2.0」的创造者表示:为Web3.0喝彩还为时尚早
  4. java中的compareTo函数
  5. mxd 对象继承法则
  6. 2 未匹配到任何借口_拼多多【关键词精确匹配溢价】给你想要的精准流量,让你订单暴增的秘诀...
  7. 【转】国密算法sm4 CBC模式加解密
  8. 前端JS笔试面试题目
  9. HTTP之get post
  10. python计算长方体体积编程_计算体积 编程创建一个Box类(长方体) 联合开发网 - pudn.com...
  11. oracle 学习日志 ----Oracle时间加减
  12. 如何备份MySql的数据库
  13. 同行代码评审过程中的实践经验
  14. 汽车维修企业管理【6】
  15. 职高计算机应用基础学的什么,职高计算机应用基础教法初探
  16. Java 往文件中写数据,新写入的数据总是覆盖原有数据
  17. java win10窗口启动假死_win10 任务栏假死
  18. 电商系统中的商品模型的分析与设计
  19. 蓝桥杯 基础练习(三)字母图形 C语言
  20. CTFShow re2 (RC4

热门文章

  1. 【Spring Boot】3.Spring Boot的配置
  2. Python内置数据结构——字符串string
  3. [译][Tkinter 教程15] event 事件绑定
  4. 剑指offer(C++)-JZ27:二叉树的镜像(数据结构-树)
  5. kopernio显示无效程序_daz 无法渲染/没有渲染/渲染不显示/渲染无效?
  6. python判断不等_Python黑魔法笔记第六关:消灭该死的重复(下)
  7. android上传文件用哪个布局,每周总结20130821——android控件的尺寸、http文件上传...
  8. unity3d 求两个点长度_Unity3D实现体积光
  9. matlab18a,Matlab R2018a安装详解
  10. python turtle_Python:turtle画粽子