首页 > 技术文章 > C++ 类的一个重要成员:静态成员(一)

iriczhao 2020-08-08 12:02 原文

写在前面

  【目录】

  一、设计需求

  二、声明静态成员

  三、总结

 

一、设计需求  

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

 

二、声明静态成员

  在类的成员的声明之前加上关键字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++的静态成员的知识总结,未完待续... 

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

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

 

推荐阅读