page contents

C++ 中 static 的用法--静态成员函数详解

在类中,static 除了可以声明静态成员变量,还可以声明...

在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只可以访问静态成员。

编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。

普通成员变量占用对象的内存,静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量,也就是说静态成员函数不能访问普通成员变量,只能访问静态成员变量


attachments-2021-04-QiiUzpBn606707f5b932d.jpg
普通成员函数必须通过对象才能调用,而静态成员函数没有 this 指针,无法在函数体内部访问某个对象,所以不能调用普通成员函数,只能调用静态成员函数。

静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。

下面是一个完整的例子,该例通过静态成员函数来获得学生的总人数和总成绩:



  1. #include <iostream>

  2. using namespace std;

  3. class Student{

  4. public:

  5. Student(char *name, int age, float score);

  6. void show();

  7. public:  //声明静态成员函数

  8. static int getTotal();

  9. static float getPoints();

  10. private:

  11. static int m_total;  //总人数

  12. static float m_points;  //总成绩

  13. private:

  14. char *m_name;

  15. int m_age;

  16. float m_score;

  17. };

  18. int Student::m_total = 0;

  19. float Student::m_points = 0.0;

  20. Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){

  21. m_total++;

  22. m_points += score;

  23. }

  24. void Student::show(){

  25. cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;

  26. }

  27. //定义静态成员函数

  28. int Student::getTotal(){

  29. return m_total;

  30. }

  31. float Student::getPoints(){

  32. return m_points;

  33. }

  34. int main(){

  35. (new Student("小明", 15, 90.6)) -> show();

  36. (new Student("李依", 16, 80.5)) -> show();

  37. (new Student("张华", 16, 99.0)) -> show();

  38. (new Student("小王", 14, 60.8)) -> show();

  39. int total = Student::getTotal();

  40. float points = Student::getPoints();

  41. cout<<"当前共有"<<total<<"名学生,总成绩是"<<points<<",平均分是"<<points/total<<endl;

  42. return 0;

  43. }

运行结果:
小明的年龄是15,成绩是90.6
李依的年龄是16,成绩是80.5
张华的年龄是16,成绩是99
小王的年龄是14,成绩是60.8
当前共有4名学生,总成绩是330.9,平均分是82.725


attachments-2021-04-VoO2Ms2960670811d8196.jpg
总人数 m_total 和总成绩 m_points 由各个对象累加得到,必须声明为 static 才能共享;getTotal()、getPoints() 分别用来获取总人数和总成绩,为了访问 static 成员变量,我们将这两个函数也声明为 static。

在C++中,静态成员函数的主要目的是访问静态成员。getTotal()、getPoints() 当然也可以声明为普通成员函数,但是它们都只对静态成员进行操作,加上 static 语义更加明确。

和静态成员变量类似,静态成员函数在声明时要加 static,在定义时不能加 static。静态成员函数可以通过类来调用(一般都是这样做),也可以通过对象来调用,上例仅仅演示了如何通过类来调用。


attachments-2021-04-p6aDXjKm606707dce128f.jpg

  • 发表于 2021-04-02 20:11
  • 阅读 ( 695 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小柒
小柒

1470 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章