博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中静态成员变量要在类外部再定义或初始化的原因
阅读量:5218 次
发布时间:2019-06-14

本文共 673 字,大约阅读时间需要 2 分钟。

C++中静态成员变量要在类外部再定义或初始化,否则会产生错误。

class A{public:	static int a;};int A::a=0;

  为什么要在类的外部进行定义的原因:

1. 在类中,只是声明了静态变量,并没有定义。

2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。    注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。

3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。    类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。

4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?  

 静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。  

 因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。  

 这会产生两种可能的情况:    

  A. 重复定义;      

B. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。          

很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。          

当然这样做,还是有可能产生线程安全的问题,但不管怎么说对象是创建好了,而这种线程安全问题,可以在编程中予以解决。

既然statci成员变量在类中只是声明那么就需要在类外部重新定义或者初始化

转载于:https://www.cnblogs.com/wuyepeng/p/9695767.html

你可能感兴趣的文章
CopyOnWriteArrayList
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
3.3.5 查询的参数传递
查看>>
用C#读取相片(JPG图片)的EXIF信息的方法
查看>>
JavaScript 鸭子模型
查看>>
PHP典型功能与Laravel5框架开发学习笔记
查看>>
PInvoke.net Visual Studio Extension
查看>>
帝国CMS (EmpireCMS)
查看>>
Mysql数据库中设置root密码的命令及方法
查看>>
我的第十四篇博客---python进程
查看>>
Xcode ipa打包时无法生成IOS APP ARCHIVE 而生成 Generic Xcode Archive
查看>>
JavaScript中的Map
查看>>
cat 生成文件 运行脚本
查看>>
didReceiveMemoryWarning-内存警告处理方法-iOS
查看>>
设计模式(一)
查看>>
神奇的口袋(dp)
查看>>
怎样使U盘可以COPY超过4G的文件
查看>>
重构第一天:封装集合
查看>>
Gitlab 维护措施
查看>>