zoukankan      html  css  js  c++  java
  • 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++的静态成员的知识总结,未完待续... 

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

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

     

  • 相关阅读:
    SpringBoot学习:整合shiro(验证码功能和登录次数限制功能)
    SpringBoot学习:整合shiro(rememberMe记住我功能)
    SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存
    SpringBoot学习:整合Redis
    SpringBoot学习:获取yml和properties配置文件的内容
    SpringBoot学习:使用spring-boot-devtools进行热部署
    SpringBoot学习:添加JSP支持
    SpringBoot学习:整合MyBatis,使用Druid连接池
    DL杂谈
    YOLO3训练widerface数据集
  • 原文地址:https://www.cnblogs.com/iriczhao/p/12830133.html
Copyright © 2011-2022 走看看