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成员一定要在类外初始化!

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/stemon/p/3423803.html
Copyright © 2011-2022 走看看