1.const规定了一个变量在它初始化值之后,值不能再改变,也就是只读

来看个例子:

const测试例子

在这个测试程序里,我试图在初始化变量c的值之后再修改c的值,编译直接报错,告诉我c已经是一个只读变量了,不可以改值。

2.static在函数内的时候,表明这个变量在函数的生命周期结束之后也不会被释放。

static使用测试

在第一次调用test()时,如果static int b没有被我赋初值,也会被默认赋值成0。然后执行自增运算,所以输出1。第二次调用test()时如果是普通的变量,则会被重新分配内存,但static类型的变量上次执行test函数之后没有被释放,而是保存在全局变量区,所以继续加一变成2。

对比一下非static的变量会怎样:

3.static在函数外的时候,表明这个变量的作用域只在该.c文件里,不能作用于整个工程。


static

  1. static局部变量 将一个变量声明为函数的局部变量,那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中
  2. static 全局变量 表示一个变量在当前文件的全局内可访问
  3. static 函数 表示一个函数只能在当前文件中被访问
  4. static 类成员变量 表示这个成员为全类所共有
  5. static 类成员函数 表示这个函数为全类所共有,而且只能访问静态成员变量

const

  1. const 常量:定义时就初始化,以后不能更改。
  2. const 形参:func(const int a){};该形参在函数里不能改变
  3. const修饰类成员函数:该函数对成员变量只能进行只读操作

在函数后加const的意义:
   我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。

1、非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误)
2、表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, 任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);
3、唯一的例外是对于mutable修饰的成员。 加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用

const成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。

static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致:1、不能直接存取类的非静态成员变量,调用非静态成员函数2、不能被声明为virtual


1、函数前后const
函数前const:普通函数或成员函数(非静态成员函数)前均可加const修饰,表示函数的返回值为const,不可修改。格式为:

const returnType functionName(param list)

函数后加const:只有类的非静态成员函数后可以加const修饰,表示该类的this指针为const类型,不能改变类的成员变量的值,即成员变量为read only(例外情况见2),任何改变成员变量的行为均为非法。此类型的函数可称为只读成员函数,格式为:

returnType functionName(param list) const

说明:类中const(函数后面加)与static不能同时修饰成员函数,原因有以下两点①C++编译器在实现const的成员函数时,为了确保该函数不能修改类的实例状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的,也就是说此时const的用法和static是冲突的;
②两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系,因此不能同时用它们。

前面使用const 表示返回值为const
后面加const表示函数不可以修改class的成员

2、const与mutable的区别
从字面意思知道,mutalbe是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量(成员变量)将永远处于可变的状态,即使在一个const函数中。因此,后const成员函数中可以改变类的mutable类型的成员变量。

#include <iostream>
using namespace std;class A{
private:int m_a;//int前加mutable关键字修饰即可编译通过
public:A():m_a(0){}int setA(int a) const{this->m_a = a;//error: l-value specifies const object}int setA(int a){this->m_a = a;}
};int main()
{A a1;return 0;
}

编译错误:error C2166: l-value specifies const object,左值为const,即const修饰后成员函数中的this指针为const,它所指向的成员变量不能被修改,将成员变量用mutable修饰后编译通过。

https://blog.csdn.net/lp10031312/article/details/79512165

https://www.cnblogs.com/Jinfeng1213/p/8597446.html

https://blog.csdn.net/gorgeous_mj/article/details/90574796

the different between Const and Static in C++相关推荐

  1. const和static readonly 区别

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用. 二者本质的区别在于,const的值是在编译期间确定的,因此只能 ...

  2. const、static、内部链接属性和外部链接属性整理

    2019独角兽企业重金招聘Python工程师标准>>> 说起const.static.以及#define大家都知道,我一直以为我也是知道的,昨天一同学说他面试时被问到#define定 ...

  3. php中const和static的区别和联系

    1.const是类中的常量,类外用define来定义常量 2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法 3.const和static都属于类本身,而不属 ...

  4. const 与 static readonly 的区别

    来作个例子吧: 先创建一个类库ClassLibrary1.dll using System; namespace ClassLibrary1 {     /// <summary>     ...

  5. const、static型数据在内存中如何存储?(变量存放位置)

    const.static型数据在内存中如何存储?(变量存放位置) static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const in ...

  6. C#中const和static readonly 的区别

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用. 二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...

  7. 为什么不能同时用const和static修饰成员函数?

    const修饰的函数: 表示在该函数体内不能修改成员的值,会在函数中添加一个隐式的参数const this*. static修饰的函数没有this指针,与const的用法冲突. 但可以使用static ...

  8. C++ static、const和static const类型成员变量声明及其初始化

    C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...

  9. C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  10. 【c++】c++常见关键词const、static、extern、explicit含义

    c++里有几个常见的关键词,比如const.static.extern.explicit,这里就简单介绍下每个关键词的含义以及使用场景. const const相对来说还是比较简单易懂的,就是被修饰的 ...

最新文章

  1. imx6 休眠 功耗 电流_无线物联网和可穿戴设备的低功耗电源测量挑战
  2. 编译ARM平台的 QtEmbedded 的MySQL插件和移植MySQL到ARM开发板
  3. java面试题3 牛客:下面有关jdbc statement的说法错误的是
  4. 用于Activity管理和应用程序退出
  5. oracle 静默 建库,静默安装Oracle 11gR2软件并且手动建库
  6. java manager 如何使用_java – Android:如何使用AlarmManager
  7. adb 安卓模拟器 进程端口_Frida初体验安卓CTF逆向
  8. 校园网免认证登录基于DNS伪装包
  9. openCV python 颜色识别
  10. xp怎么删除计算机用户,xp如何删除多余的用户帐户_IT /计算机_信息
  11. 程序员找不到对象是伪命题?他用大数据找对象,现在婚都结了
  12. runtime error python怎么解决_RuntimeError: Python is not installed as a framework 错误解决方案...
  13. 实验四 javaAPI(预习报告)
  14. 写的一个网页登录注册模板(css+js),注册成功后把账号保存到MySQL数据库,登录时从数据库查找进行验证(jsp+javabean)
  15. Js 根据经纬度坐标计算方位角
  16. JPG转换成PDF转换器使用说明
  17. [源码解析] PyTorch 流水线并行实现 (1)--基础知识
  18. 【JavaScript练习】用户输入一个数判断是否是素数,并弹出返回值
  19. .netframework3.5中TimeZoneInfo 类的使用
  20. rd授权管理器不显示服务器,确定 RD 会话主机服务器可能出现的授权问题

热门文章

  1. C++ 笔记(09)— 字符串(C 风格字符串、C++字符串 string)
  2. 算法设计思想(1)— 穷举法
  3. 个人作业1——四则运算题目生成程序
  4. 做技术到底可以做到哪种地步-技术为什么越走越窄 (转)
  5. 图形化编程 html,用GoJS实现图形化交互编程界面示例
  6. 狗年拜年php源码,2018狗年拜年词大全!再也不担心拜年没祝词啦~祝您新年快乐!...
  7. list redis 怎样做排行_学 Redis 的 7000 字小结!!!
  8. php留言板入门教程,一个php留言板实例详解(附源码下载)
  9. Oracle排序排除null,oracle 排序(中文,null的处理)
  10. python内置方法就是内置函数_python内置函数