the different between Const and Static in C++
1.const规定了一个变量在它初始化值之后,值不能再改变,也就是只读。
来看个例子:
const测试例子
在这个测试程序里,我试图在初始化变量c的值之后再修改c的值,编译直接报错,告诉我c已经是一个只读变量了,不可以改值。
2.static在函数内的时候,表明这个变量在函数的生命周期结束之后也不会被释放。
static使用测试
在第一次调用test()时,如果static int b没有被我赋初值,也会被默认赋值成0。然后执行自增运算,所以输出1。第二次调用test()时如果是普通的变量,则会被重新分配内存,但static类型的变量上次执行test函数之后没有被释放,而是保存在全局变量区,所以继续加一变成2。
对比一下非static的变量会怎样:
3.static在函数外的时候,表明这个变量的作用域只在该.c文件里,不能作用于整个工程。
static
- static局部变量 将一个变量声明为函数的局部变量,那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中
- static 全局变量 表示一个变量在当前文件的全局内可访问
- static 函数 表示一个函数只能在当前文件中被访问
- static 类成员变量 表示这个成员为全类所共有
- static 类成员函数 表示这个函数为全类所共有,而且只能访问静态成员变量
const
- const 常量:定义时就初始化,以后不能更改。
- const 形参:func(const int a){};该形参在函数里不能改变
- 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++相关推荐
- const和static readonly 区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用. 二者本质的区别在于,const的值是在编译期间确定的,因此只能 ...
- const、static、内部链接属性和外部链接属性整理
2019独角兽企业重金招聘Python工程师标准>>> 说起const.static.以及#define大家都知道,我一直以为我也是知道的,昨天一同学说他面试时被问到#define定 ...
- php中const和static的区别和联系
1.const是类中的常量,类外用define来定义常量 2.const只可以修饰类的属性,不能修饰类的方法,static可以修饰属性,也可以修饰方法 3.const和static都属于类本身,而不属 ...
- const 与 static readonly 的区别
来作个例子吧: 先创建一个类库ClassLibrary1.dll using System; namespace ClassLibrary1 { /// <summary> ...
- const、static型数据在内存中如何存储?(变量存放位置)
const.static型数据在内存中如何存储?(变量存放位置) static int val_a = 1 ; // 初始化的静态变量 int val_b = 2 ; // 全局变量 const in ...
- C#中const和static readonly 的区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用. 二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...
- 为什么不能同时用const和static修饰成员函数?
const修饰的函数: 表示在该函数体内不能修改成员的值,会在函数中添加一个隐式的参数const this*. static修饰的函数没有this指针,与const的用法冲突. 但可以使用static ...
- C++ static、const和static const类型成员变量声明及其初始化
C++ static.const和static const类型成员变量声明及其初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. ...
- C++ static、const和static const 以及它们的初始化
const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...
- 【c++】c++常见关键词const、static、extern、explicit含义
c++里有几个常见的关键词,比如const.static.extern.explicit,这里就简单介绍下每个关键词的含义以及使用场景. const const相对来说还是比较简单易懂的,就是被修饰的 ...
最新文章
- imx6 休眠 功耗 电流_无线物联网和可穿戴设备的低功耗电源测量挑战
- 编译ARM平台的	QtEmbedded 的MySQL插件和移植MySQL到ARM开发板
- java面试题3 牛客:下面有关jdbc statement的说法错误的是
- 用于Activity管理和应用程序退出
- oracle 静默 建库,静默安装Oracle 11gR2软件并且手动建库
- java manager 如何使用_java – Android:如何使用AlarmManager
- adb 安卓模拟器 进程端口_Frida初体验安卓CTF逆向
- 校园网免认证登录基于DNS伪装包
- openCV python 颜色识别
- xp怎么删除计算机用户,xp如何删除多余的用户帐户_IT /计算机_信息
- 程序员找不到对象是伪命题?他用大数据找对象,现在婚都结了
- runtime error python怎么解决_RuntimeError: Python is not installed as a framework 错误解决方案...
- 实验四 javaAPI(预习报告)
- 写的一个网页登录注册模板(css+js),注册成功后把账号保存到MySQL数据库,登录时从数据库查找进行验证(jsp+javabean)
- Js 根据经纬度坐标计算方位角
- JPG转换成PDF转换器使用说明
- [源码解析] PyTorch 流水线并行实现 (1)--基础知识
- 【JavaScript练习】用户输入一个数判断是否是素数,并弹出返回值
- .netframework3.5中TimeZoneInfo 类的使用
- rd授权管理器不显示服务器,确定 RD 会话主机服务器可能出现的授权问题
热门文章
- C++ 笔记(09)— 字符串(C 风格字符串、C++字符串 string)
- 算法设计思想(1)— 穷举法
- 个人作业1——四则运算题目生成程序
- 做技术到底可以做到哪种地步-技术为什么越走越窄 (转)
- 图形化编程 html,用GoJS实现图形化交互编程界面示例
- 狗年拜年php源码,2018狗年拜年词大全!再也不担心拜年没祝词啦~祝您新年快乐!...
- list redis 怎样做排行_学 Redis 的 7000 字小结!!!
- php留言板入门教程,一个php留言板实例详解(附源码下载)
- Oracle排序排除null,oracle 排序(中文,null的处理)
- python内置方法就是内置函数_python内置函数