一、隐藏作用

指的是加static关键字的变量只在源文件cpp中起作用,无法在其中文件中被调用。

举例来说明:

分别创建两个cpp文件。一个是main函数所处的cpp 一个是自己定义的demo.cpp

demo.cpp代码如下:里面主要是定义了一个char类型字符a和msg函数

#include "stdafx.h"char a ='a';
void msg(){std::cout << "demo" << std::endl;
}

main.cpp代码如下:主要是通过extern 来引用这两个方法 并执行

#include "stdafx.h"
#include "demo.h"using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{extern char a;extern void msg();cout<< a << endl;msg();return 0;
}

此时是未加入static关键字运行结果:

此时可以看到,a和msg()方法均被引用到,现在在demo.cpp中加上static关键词,看看会发生什么情况:

#include "stdafx.h"static char a ='a';
static void msg(){std::cout << "demo" << std::endl;
}

运行结果如下:

可以很容易看出 它无法被引用,说明在c++中 变量加上static 有隐藏的作用

二、封装在函数中,保持变量的持久性

这种理解起来可能有点难,通俗的来讲,就是在函数中,如果初始化一次之后,之后多次调用函数,这个参数就无需再初始化,因为该值已经保存了。

用示例来讲解:

一种是加了static的代码:

// test.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "demo.h"
using namespace std;int func(){static int i_count = 10;return i_count--;
}int _tmain(int argc, _TCHAR* argv[])
{for (int i  = 0 ; i < 10 ; i++){int dd =    func();cout << dd <<endl;}return 0;
}

代码比较简单。就是执行10次func函数,运行结果:

可以很明显的从结果中看出来,static的参数i_count 就初始化了一次。

接下来不加static 我们来看看

// test.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "demo.h"
using namespace std;int func(){int i_count = 10;return i_count--;
}int _tmain(int argc, _TCHAR* argv[])
{for (int i  = 0 ; i < 10 ; i++){int dd =    func();cout << dd <<endl;}return 0;
}

运行结果:

非常明显可看出来,它每调一次都会初始化一次,比较方便大家理解。

三、static变量初始化为0 

原理:静态数据区,内存字节默认为0x00;you know

示例:

#include "stdafx.h"
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{
int i ;
static int m;
cout << i << endl;
return 0;
}

首先是输出没加static的变量i 我们看结果:

明显可以看到without being initialized 可以看到未被初始化,

接下来我们来看一下输出加static之后的i 会发生什么呢。

可以看到i输出了,说明加上static 会先默认初始化为0。

四、static在C++类成员中的作用:(此处摘抄来自:https://www.cnblogs.com/songdanzju/p/7422380.html

 在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。     

示例代码:

//头文件.h
#include "stdafx.h"
using namespace std;class Demo{
public:Demo();~Demo();static int d ;static void demod();void msg();int cb_str;
};//.cpp
#include "stdafx.h"
#include "demo.h"
using namespace std;//extern int var_str;
Demo::Demo(){cb_str = 2;//int Demo::d = 2;
//var_str = 2;
}
//static Demo::var_str = 2;Demo::~Demo(){}int Demo::d = 1;void  Demo::demod(){//cout << cb_str << endl; //访问其他变量出错cout << d << endl;
}
void Demo::msg()
{
}

这里可以看出 d 属于静态成员变量 cb_str属于非静态成员变量 接下来静态成员函数demod 引用非静态成员变量 cb_str 运行 查看效果如下:

实际操作可知:它仅能访问类的静态数据和静态成员函数。     

(2)不能将静态成员函数定义为虚函数。      

(3)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

(4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W indow系统结合,同时也成功的应用于线程函数身上。 (这条没遇见过)  

(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。      

(6)静态数据成员在<定义或说明>时前面加关键字static。      

(7)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误) 

(8)静态成员初始化与一般数据成员初始化不同:

初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;        
初始化时使用作用域运算符来标明它所属类;
           所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>

(9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

希望对大家有帮助吧 这个概念还是很基础的 但是最终还是实际上用出来比较好。

接下来后面写const关键字的作用,这两个比较面试常考

C++ static关键字作用讲解相关推荐

  1. C++中static关键字作用总结

    from:https://www.cnblogs.com/songdanzju/p/7422380.html 1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可) ...

  2. java static关键字_Java基础:static关键字作用总结

    前言 之前讲到final关键字的作用是每次面试的时候我必问求职者的两个问题之一,另外一个问题就是文本会写到的static.final和static一样,都是一个小问题可以看到一个人的基础是否扎实以及平 ...

  3. java 释放static_JAVA中的static关键字作用与用法

    static关键字: 一.特点: 1.static是一个修饰符,用于修饰成员.(成员变量,成员函数)static修饰的成员变量称之为静态变量或类变量. 2.static修饰的成员被所有的对象共享. 3 ...

  4. static 关键字作用

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  5. C++中static关键字作用

    1.对于函数定义和代码块之外的变量声明,static修改标识符的链接属性,由默认的external变为internal,作用域和存储类型不改变,这些符号只能在声明它们的源文件中访问. 2.对于代码块内 ...

  6. static、const、volatile等关键字作用

    目录 一.需要明白c语言中对象的一些属性 1.C语言中内存分配 2.变量的作用域 3.链接属性 4.存储期 二.static.const.volatile关键字作用 1.static关键字作用 2.c ...

  7. C语言中static关键字和break/continue在for/while循环中的作用

    前言 此篇博客对C语言的基础知识稍加总结,包括C语言中的static关键字作用,三大循环语句中出现的break和continue对循环体的影响,常量,生命周期,作用域,字符串,转义字符等等,其中常见的 ...

  8. C++ static关键字总结

    static关键字 static关键字作用 隐藏 全局生存期 默认初始化为0 static变量的初始化时间 成员函数内定义static变量(不安全,各对象之间共享) static关键字作用 隐藏 先来 ...

  9. Java的Static关键字的作用

    static关键字的作用 参考博客:static关键字的四种用法 static : 静态的 Static的特点 1.static是一个修饰符,用于修饰成员 2.static修饰的成员被所有的对象所共享 ...

最新文章

  1. 马斯克SpaceX内部信曝光:戒骄戒躁,我们的首要任务是星际飞船
  2. mysql建用户无密码_mysql建用户和修改密码和忘记密码的解决办法
  3. java公路车 superma_SuperMac80
  4. 机器学习——人工神经网络之参数设置(BP算法)
  5. 老罗android oat,入门ART虚拟机(5)——OAT文件
  6. [Lydsy1805月赛] 对称数
  7. 使用Python requests post上传图片及示例demo
  8. MTK 驱动开发(28)--6797平台 TP 移植
  9. 苹果企业版帐号申请记录
  10. 【剑指offer】八皇后问题
  11. java sybase 驱动_Java连接Sybase数据库
  12. linux用gzip文件,Linux中的Gzip命令
  13. JAVA-----集合子接口Queue及其子接口Deque
  14. 官方版win10重装系统(官方win10 镜像)
  15. adb 查看屏幕大小_如何从adb命令行获取Android设备的屏幕尺寸?
  16. 利用python爬虫技术实现基于本福特定律_基于Python技术的校园网搜索引擎的设计与实现...
  17. 计算机硬盘怎么整理,w7怎么整理磁盘碎片_如何清理win7电脑磁盘碎片
  18. [转载]“澜爵酒堡”杯常青藤公开赛参赛名单--公开组C
  19. 嵌入式AI-K210篇-硬件-模型训练、部署
  20. c语言上期中考试试卷答案,2007~2008学年度上学期C语言程序设计期中试卷及答案...

热门文章

  1. 更快更强,来试试 Mybatis 的增强版——EasyMybatis
  2. JDK15已发布,快来看看有哪些值得期待的新功能!
  3. 在idea中使用CheckStyle来规范代码
  4. intellij IDEA 关于src等某些文件夹不能右键新建class文件问题
  5. 基坑监测日报模板_深基坑支护施工安全技术措施
  6. Solr 检索不存在某字段或某字段为某值的方式
  7. UE4 无法include “filename.generated.h”
  8. 思考…求知(double和Double的区别)
  9. Oracle基础(六) 数据类型
  10. ajax 获取JSON