转载自:ZJE_ANDY

static修饰类中成员,表示类的共享数据

1.static类成员

C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,

但不与该类定义的对象有任何关系。即static不会像普通类数据成员一样每一个类对象都有一份,全部类对象是共享一个static类成员的。

例如A类对象修改了static成员为1,那么B对象对应的static类对象成员的值也会是1。

注意:static类对象必须要在类外进行初始化

 1 class Text
2 {
3 public:
4 static int count;
5 };
6
7 int Text::count=0;//用static成员变量必须要初始化
8
9 int main()
10 {
11 Text t1;
12 cout<<t1.count<<endl;
13 return 0;
14 }//程序输出0

static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的变量,必须要比对象先存在。

 1 class Text
2 {
3 public:
4 static int count;
5 };
6
7 int Text::count=0;//用static成员变量必须要初始化
8
9 int main()
10 {
11 Text t1;
12 Text t2;
13
14 t1.count = 100; //t1对象把static成员count改为100
15 cout<<t2.count<<endl; //当t2对象打印static成员的时候,显示的是100而不是0
16 return 0;
17 }

好处:

用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的。所以用static修饰一方面的好处

是可以节省对象的内存空间。如同你创建100个Person对象,而这100个对象都有共有的一个变量,例如叫国籍变量,就是Person对象的国籍都是相同的。

那如果国籍变量用static修饰的话,即使有100个Person对象,也不会创建100个国籍变量,只需要有一个static修饰的国籍变量就可以了。这100个对象要用的时候,

就会去调用static修饰的国籍变量。否则有100个Person变量,就会创建100个国籍变量,在国籍变量都是相同的情况下,就等于浪费空间了。

2.static类成员函数

由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数

不能访问非static的类成员,只能访问 static修饰的类成员。

 1 class Text
2 {
3 public:
4 static int fun()
5 {
6 return num;
7 }
8 static int count;
9 int num;
10 };
11 int Text::count=5;//用static成员变量必须要初始化
12
13 int main()
14 {
15 Text t1;
16 Text t2;
17 t1.num=100;
18
19 t1.fun();//发生错误,fun函数return的是非static类成员 如果return count就正确
20 return 0;
21 }

【C++】C++类的static 关键字理解的更多相关文章

  1. 高级类特性----static关键字

    static 关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用. 我们 ...

  2. 2.18 C++类与static关键字

    参考:http://www.weixueyuan.net/view/6349.html 总结: 类中的成员变量或成员函数一旦与static关键字相结合,则该成员变量或成员函数就是属于类的,而不是再是属 ...

  3. Java 类和Static关键字

    类的定义 类的命名.首字母大写 大括号后面没有分号 成员变量 Java会自动初始化成员变量但是不会自动初始化局部变量: 可以在定义成员变量是直接初始化,成员变量的作用范围在整个类体 对象的创建和引用的 ...

  4. String类、static关键字、Arrays类、 Math类的一些学习心得

    String类 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例. 类 String 中包括用于检查各 ...

  5. C static 关键字理解

    今天来看一下这么一个程序. #include<stdio.h> int count =1; int fun(void) { static int count =10; return cou ...

  6. static 关键字有什么作用

    static关键字的含义及使用场景 static是Java50个关键字之一.static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法.(注意:不能修饰 ...

  7. static关键字的新用法

    static关键字的新用法和总结: static这个关键字,也可以像“self”一样,代表“当前类”,用于访问一个类的“静态属性或静态方法”: 但, static,在应用中,更灵活,因此更常见! 因为 ...

  8. 理解Java中的final和static关键字

    回顾这两个关键字前,先考虑一个问题: Static变量存储在JVM中的位置,或者说static变量是如何被加载的? JVM会把类的静态方法和静态变量在类加载的过程中读入方法区(Method Area) ...

  9. 深入理解final和static关键字

    深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...

随机推荐

  1. js 格式化 json 字符串

    1.JSON.stringify的三个参数 var json = {"@odata.context":"$metadata#AddTableOne_466281s&quo ...

  2. 自己实现一个简化版的SpringMVC框架

    废话不多说,我们进入今天的正题,在Web应用程序设计中,MVC模式已经被广泛使用.SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实 ...

  3. Chrome去掉标签页8个框

    最终效果: 解决思路: 在标签页鼠标右击弹出的菜单项中存在“查看页面源码”一项,由此可确定chrome的标签页是由一个html页面控制的,只要修改其页面源码便能去掉8个框. 经网上查阅确定了标签页的源 ...

  4. 你在和脚本谈恋爱(自动化在IM聊天中的应用)

    谢谢打开这篇文章的每个你 测开之分层自动化(Python)招生简章 Python自动化测试报告美化 在python中进行数据驱动测试 太嚣张了!他竟用Python绕过了“验证码” 在网络世界里你不知道 ...

  5. 什么是Redis缓存穿透、缓存雪崩和缓存击穿

    https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pc 缓存穿透 缓存穿透,是指查询一个数据库一定 ...

  6. Java I/O(三)各种Reader和Writer读写器、RandomAccessFile随机访问文件、序列化

    2019 01/01 八.Reader和Writer读写器 前面讲的输入输出流的基本单位都是字节,因此可以称为“字节流”,读写器是以字符为基本单位,可以称为“字符流”.它们的使用方法非常相似,因此我考 ...

  7. Angular4.x+Ionic3 踩坑之路之 Ionic3.x pop反向传值

    1.Ionic3.x 页面正向传值 关于正向传值,上一篇文章里面有讲,具体可以看这里https://segmentfault.com/a/11... 2.Ionic3.x 页面 pop反向传值,主要有 ...

  8. keep-alive实现返回保留筛选条件及筛选结果

    实现页面返回时,保留筛选条件和筛选结果 说明 . keep-alive 是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM 实现 结合router实现部分页面缓存 模板应用 ...

  9. radio(单选框)/checkbox(复选框) 美化

    由于某种原因,可能需要对单选框(radio)或复选框(checkbox)进行美化,那么直接修改样式是行不通,要实现就需要添加js,以下js依赖于jquery radio.js: function ra ...

  10. python插入mysql数据(2)

    python插入mysql数据(2) """插入操作""" import pymysql import datetime from pymy ...