• C++ 类的一个重要成员:静态成员(一)


    写在前面

      【目录】

      一、设计需求

      二、声明静态成员

      三、总结

     

    一、设计需求  

      为了实现一个类的一些成员与类本身相关,而不是与类的各个对象保持关联。这时候类的静态成员特性就可以派上用场。

     

    二、声明静态成员

      在类的成员的声明之前加上关键字static就可以使其与类关联在一起。成员与其他的类成员一样,同样可以是public和private的。对于静态成员的类型可以是常量、引用、指针、类类型等。

     

      注意几点:

      (1)类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。

      (2)对于静态成员函数,其不与任何对象绑定在一起,即不包含this指针。所以,静态成员函数不能声明成const的,也不能在static函数体内使用this指针。

     

        对于第一点:看以下代码:

     1 #include <iostream>
     2 class student
     3 {
     4 public :
     5     student()
     6     {
     7         score  = 100;    
     8         number = 123;
     9     }
    10     static int grade;    //因学生年级一样,声明成静态成员
    11 private:
    12     int score;
    13     int number;
    14 };
    15 int student::grade = 999;
    16 
    17 //main app
    18 int main()
    19 {
    20     student student1;
    21     
    22     std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
    23     std::cout<<"class student grade:"<<student::grade;
    24 }

      程序运行后输出:

      

     

     

       可见student1为 8个字节,然后将score 和number都声明成静态的。如下代码:

     1 #include <iostream>
     2 class student
     3 {
     4 public :
     5     static int grade;    //因学生年级一样,声明成静态成员
     6 
     7     static int score;
     8     static int number;
     9 };
    10 int student::grade = 999;
    11 
    12 //main app
    13 int main()
    14 {
    15     student student1;
    16     
    17     std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
    18     
    19     std::cout<<"class student grade:"<<student::grade;
    20     std::cout<<"class student score:"<<student::score;
    21     std::cout<<"class student number:"<<student::number;
    22 }

      见以上代码,该代码是编译不通过的。原因由socre和number引起,报错如下:

           

     

       这里修改以上代码,可以把20,21行注释,即不输出score和number(相当于不用),或者像第10行代码一样定义它们。出现以上问题的原因是:静态成员score和number没有被定义。修改后程序如下:

     1 #include <iostream>
     2 class student
     3 {
     4 public :
     5     static int grade;    
     6     static int score;
     7     static int number;
     8 };
     9 int student::grade = 999;
    10 int student::score = 111;
    11 int student::number = 222;
    12 //main app
    13 int main()
    14 {
    15     student student1;
    16     
    17     std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
    18     
    19     std::cout<<"class student grade:"<<student::grade<<std::endl;
    20     std::cout<<"class student score:"<<student::score<<std::endl;
    21     std::cout<<"class student number:"<<student::number<<std::endl;
    22 }

      此刻:编译通过,程序运行结果为:

           

     

       注意:这里student1为 1个字节。

     

    三、总结:

      类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据,通过以上实际代码分析,这一知识点更加深入。可见:这对类对象所占用的空间大小是有影响的。当把类中grade、score、number都声明成静态成员时,sizeof该对象,为什么是1呢,哈哈,这留个问题。(说一下,我用的编译器环境:MinGW构建套件中的g++)

      本系列关于C++的静态成员的知识总结,未完待续... 

    -------------------------------------------------------------------------------

      知识如何深入到自己大脑中,我想,只有不断地回想和不断地实践。今儿周六,记一笔...

     

  • 相关阅读:
    Android系统进程Zygote启动过程的源代码分析
    Android系统默认Home应用程序(Launcher)的启动过程源代码分析
    Android应用程序安装过程源代码分析
    Android应用程序进程启动过程的源代码分析
    Android应用程序绑定服务(bindService)的过程源代码分析
    Android应用程序发送广播(sendBroadcast)的过程分析
    Android应用程序注册广播接收器(registerReceiver)的过程分析
    Android系统中的广播(Broadcast)机制简要介绍和学习计划
    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:
    解开Android应用程序组件Activity的"singleTask"之谜
  • 原文地址:https://www.cnblogs.com/iriczhao/p/12830133.html
Copyright © 2020-2023  润新知