博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么static数据成员一定要在类外初始化?(转)
阅读量:5286 次
发布时间:2019-06-14

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

1.避免重复定义和初始化

<<c++ primer>>说在类外定义和初始化是保证static成员变量只被定义一次的好方法。

但,为什么static const int就可以在类里面初始化呢?

想起C中一个函数里定义一个static变量是为了保证只初始化一次。

那么,是否可以这样理解:

static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。

static const int可以在类里面初始化,是因为它既然是const的,那程序就不会再去试图初始化了。

 

而且,<<c++ primer>>说static const int也必须在类外定义,类里面的只是声明和初始化(但是linux下用GCC试的结果是

:不用在类外定义也完全可以,gcc version 3.4.6)。

 

2.满足C++的static语意

这里的语意,应该就是1中说的意思了吧

 

只有const没有static的话,类的每个object都有这个const变量,也不能在类的数据成员声明的时候一起初始化了,只能在构造函数的初始化列表里初始化。

 

//下面是网上看到的内容:

+++++++++++++++++++++++++

#include   <iostream.h> 

class   CDummy 
public: 
        static   int   n; //这里只是声明
}; 
int   CDummy::n=9; //这里是定义加初始化
void   main() 
        cout < <CDummy::n < <endl; 
上面这样完全没问题,但是不能直接在类中初始化,比如: 
static   int   n=9; 
+++++++++++++++++++

 

 

为什么static成员一定要在类外初始化? 

        这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside   The   C++   Object   Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗? 
            所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!

转载于:https://www.cnblogs.com/dongsheng/p/3327498.html

你可能感兴趣的文章
smarty模板自定义变量
查看>>
研究称90%的癌症由非健康生活习惯导致
查看>>
命令行启动Win7系统操作部分功能
查看>>
排序sort (一)
查看>>
Parrot虚拟机
查看>>
Teamcenter10 step-by-step installation in Linux env-Oracle Server Patch
查看>>
Struts2学习(三)
查看>>
Callable和Runnable和FutureTask
查看>>
GitHub 多人协作开发 三种方式:
查看>>
文本域添加编辑器
查看>>
Yum安装MySQL以及相关目录路径和修改目录
查看>>
java获取hostIp和hostName
查看>>
关于web服务器和数据库的各种说法(搜集到的)
查看>>
C# Stream 和 byte[] 之间的转换
查看>>
OMG: daily scrum nine
查看>>
redis与spring结合错误情况
查看>>
第六章 字节码执行方式--解释执行和JIT
查看>>
字符串方法title()、istitle()
查看>>
yield语句
查看>>
查看linux系统中占用cpu最高的语句
查看>>