zoukankan      html  css  js  c++  java
  • 再看static数据成员

    当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。
    静态数据成员的用途之一是统计有多少个对象实际存在。
    静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在够造函数中初始化该成员,因为静态数据成员为类的各个对象共享,那么每次创建一个类的对象则静态数据成员都要被重新初始化。
     1 #include   <iostream.h> 
     2 
     3 class   CDummy 
     4 { 
     5 public: 
     6         static   int   n; //这里只是声明
     7 }; 
     8 
     9 int   CDummy::n=9; //这里是定义加初始化
    10 
    11 void   main() 
    12 { 
    13         cout < <CDummy::n < <endl; 
    14 } 

    上面这样完全没问题,但是不能直接在类中初始化,比如: 

    static   int   n=9; 

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

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

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

                所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!

  • 相关阅读:
    洛谷P1880 [NOI1995]石子合并 (区间dp
    洛谷P1012 拼数(水题 字符串
    洛谷P1071 潜伏者(水题
    微信《跳一跳》超高分攻略,轻松排行榜首
    StringUtilsd的isEmpty、isNotEmpty、isBlank、isNotBlank
    java.util.Properties类
    timer.scheduleAtFixedRate和timer.schedule的实验
    schedule() 和 scheduleAtFixedRate() 区别
    session和jsessionid有什么关系
    增加Xss过滤步骤
  • 原文地址:https://www.cnblogs.com/stemon/p/3423803.html
Copyright © 2011-2022 走看看