目录

static的作用:

对普通变量:

1.局部变量:

2.全局变量

对类中变量:

1.成员变量

2.成员函数

const的作用:


static的作用:

对普通变量:

1.局部变量:

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置(从原来的栈中存放改为静态存储区)及其生命周期(局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问),但未改变其作用域。

2.全局变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

这里面值得注意的是,不管是局部变量、全局变量还是普通函数,只要被static修饰了,其作用域只对自己的编译单元有效(包含.h和.cpp文件),有static修饰变量的头文件被其他文件包含,其他文件是不能使用该变量的。

注:static修饰全局变量,并未改变其存储位置及生命周期,而是改变了其作用域,使当前文件外的源文件无法访问该变量,好处如下:(1)不会被其他文件所访问,修改;(2)其他文件中可以使用相同名字的变量,不会发生冲突。对全局函数也是有隐藏作用。而普通全局变量只要定义了,任何地方都能使用,使用前需要声明所有的.c文件,只能定义一次普通全局变量,但是可以声明多次(外部链接)。

注意:全局变量的作用域是全局范围,但是在某个文件中使用时,必须先声明,使用extern关键字或者包含全局变量声明的头文件

对类中变量:

1.成员变量

  用static修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。因此,static成员必须在类外进行初始化(初始化格式: int base::var=10;),而不能在构造函数内进行初始化,不过也可以用const修饰static数据成员在类内初始化 。
  特点:
1)、不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。 
2)、静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
3)、静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的指针或引用。

2.成员函数

用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针。
静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。base::func(5,3);当static成员函数在类外定义时不需要加static修饰符。
在静态成员函数的实现中不能直接引用类中非静态成员,可以引用类中说明的静态成员。因为静态成员函数不含this指针。

不可以同时用const和static修饰成员函数。
C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。

总结:(1)对于数据成员和普通数据可以使用static和const修饰 (2)对于成员函数不可同时使用static和const修饰,因为静态成员函数不属于类,没有this指针。

我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

const的作用:

1.限定变量为不可修改。
2.限定成员函数不可以修改任何数据成员。

用法如下:int GetCount(void) const;----在函数末尾加const关键字
3.const与指针:
const char *p 和char const *p都表示 指向的内容不能改变。
char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。

  1. 阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
  2. 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
  3. 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
  4. 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量,类的常对象只能访问类的常成员函数;
  5. 对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
  6. const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
  7. 非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
  8. 一个没有明确声明为const的成员函数被看作是将要修改对象中数据成员的函数,而且编译器不允许它为一个const对象所调用。因此const对象只能调用const成员函数。
  9. const类型变量可以通过类型转换符const_cast将const类型转换为非const类型;
  10. const类型变量必须定义的时候进行初始化,因此也导致如果类的成员变量有const类型的变量,那么该变量必须在类的初始化列表中进行初始化;
  11. 对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来。

C++ static与const用法详解相关推荐

  1. php const用法详解

    php const用法详解 在编程中,我们一般用常量来定义那些在运行时不能被改变的常数值,下面让我们来看看php中的const吧,这个东西其 实没有什么好说的,只是为了知识的完善而随便说下吧.在定义一 ...

  2. C语言高频率--typedef和const用法详解

    一.typedef用法详解 C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 st ...

  3. C语言中const用法详解

    C语言中const用法详解 const修饰普通变量 const作用在于定义一个常量,比如const int a = 10,代表a的值不能被直接修改了,是一个常量,但仍可以通过指针的方式间接修改,如下图 ...

  4. Java类中this关键字和static关键字的用法详解

    今天给大家总结介绍一下Java类中this关键字和static关键字的用法. 文章目录 this关键字用法: 1:修饰属性,表示调用类中的成员变量 2:this修饰方法 3:this表示当前对象的引用 ...

  5. java中finaljava中this_Java中this,static,final,const用法详解

    一.this 用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?JAVA提供了一个很好的东西, ...

  6. Java中static作用及用法详解

    1.1概述: static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存 ...

  7. php const 怎么用,php const用法详解

    在编程中,我们一般用常量来定义那些在运行时不能被改变的常数值,下面让我们来看看php中的const吧,这个东西其 实没有什么好说的,只是为了知识的完善而随便说下吧.在定义一个常量的时候我们可以使用co ...

  8. const 用法详解

    当不想从外部调用成员函数修改成员变量时,可以将其被调成员函数加上const 每个成员函数都有个隐式 this 指针,指向调用对象 代码 1 // CBox 类头文件 2  #pragma once 3 ...

  9. C语言const用法详解(带实例)

    const与define区别 在C语言中const常用来定义常量,表示这个常量是不可以被修改的.define宏定义也可以用来表示一个常量.那么他们有那些区别呢! 1.预编译指令只是对值进行简单的替换, ...

最新文章

  1. java stop graceful
  2. 【MySQL】数据库死锁查询及处理
  3. Qt 【关于控件样式,鼠标进入、离开、点击】
  4. 【学习OpenCV4】图像像素数据类型的转换与归一
  5. MyBatis 简介
  6. 蓝桥杯历年真题及详细解答
  7. [入门] 探索FireMonkey的StyleBook皮肤控件的使用(附示例程序)
  8. 高流明投影仪品牌,这份投影仪行业数据告诉你答案
  9. 中国集成灶10大品牌排行榜揭晓,公认的集成灶10大品牌是哪几个?
  10. ESP8266深度睡眠计时器唤醒
  11. 【模型分享】全网质量最高最全《王者荣耀》角色3D模型独立角色
  12. 【百度地图】折线图平面图
  13. 第九届广东省大学生程序设计竞赛排名
  14. 适合穷人挣钱最快的方法
  15. tplink支持Linux的无线网卡,Ubuntu 8.04下安装TP-Link TL-WN-322G+ 1.0 无线网卡
  16. 北京法院京牌小客车司法处置数据统计(Pandas)
  17. 利用HTML+css+js制作侧边栏小广告
  18. 为何别人家的会议井然有序?原来是它的功劳
  19. 计算机图形学中的四元数(Quaternions)
  20. 2020美赛数学建模 校级培训——Week_3

热门文章

  1. 作为利物浦大学和西浦的学生的职业机会发展平台!很重要!
  2. [导入]为Exchange Server安装WAP电子邮件网关
  3. BitMap的原理和实现
  4. 10月份个人技术指标
  5. Tower-web 0.3.1/2 发布,类型完善和修复更新
  6. 如何使用ABAP Restful API进行代码的全文搜索
  7. 想服务器不宕机,你了解Linux“体检”指标吗?
  8. 关于J2EE+DOTNET的一些网站
  9. Unix/Linux下文件基本操作[zt]
  10. Application,Session和Cookies的区别