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

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

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

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

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

通过静态成员函数来获得学生的总人数和总成绩:

#include <iostream>
using namespace std;class Student{public:Student(char *name, int age, float score);void show();
public:  //声明静态成员函数static int getTotal();static float getPoints();
private:static int m_total;  //总人数static float m_points;  //总成绩
private:char *m_name;int m_age;float m_score;
};int Student::m_total = 0;
float Student::m_points = 0.0;Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){m_total++;m_points += score;
}
void Student::show(){cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
//定义静态成员函数
int Student::getTotal(){return m_total;
}
float Student::getPoints(){return m_points;
}int main(){(new Student("张三", 15, 90.6)) -> show();(new Student("李四", 16, 80.5)) -> show();(new Student("王五", 16, 99.0)) -> show();(new Student("赵六", 14, 60.8)) -> show();int total = Student::getTotal();float points = Student::getPoints();cout<<"当前共有"<<total<<"名学生,总成绩是"<<points<<",平均分是"<<points/total<<endl;return 0;
}

运行结果:

张三的年龄是15,成绩是90.6
李四的年龄是16,成绩是80.5
王五的年龄是16,成绩是99
赵六的年龄是14,成绩是60.8
当前共有4名学生,总成绩是330.9,平均分是82.725

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

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

和静态成员变量类似**,静态成员函数在声明时要加 static,在定义时不能加 static**。静态成员函数可以通过类来调用(一般通过类来进行调用),也可以通过对象来调用。

C++ static静态成员函数相关推荐

  1. C++ static静态成员函数详解

    在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员. 编译器在编译一个普通成员函数时,会隐式地 ...

  2. C++ static静态成员函数小结

    在C++的类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员. 1.静态成员函数可以通过类直接调 ...

  3. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  4. 深入解析C++编程中的静态成员函数

    这篇文章主要介绍了深入解析C++编程中的静态成员函数,是C++入门学习中的基础知识,需要的朋友可以参考下 C++静态成员函数 与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加stat ...

  5. C++之类的静态成员变量和静态成员函数

    static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员 ...

  6. C++之静态成员变量和静态成员函数

    静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象的共享机制 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 stati ...

  7. 为什么静态static成员函数不能成为virtual虚函数

    首先什么是static静态成员函数?静态成员函数不属于类中的任何一个对象和实例,属于类共有的一个函数.也就是说,它不能用this指针来访问,因为this指针指向的是每一个对象和实例. 对于virtua ...

  8. C++ 静态成员变量与静态成员函数

    一.静态成员变量 1)定义静态成员变量  关键字 static 可以用于说明一个类的成员,静态成员提供了一个同类对象的共享机制  把一个类的成员说明为 static 时,这个类无论有多少个对象被创 ...

  9. 类中的静态成员变量和静态成员函数

    static静态成员函数 1.static 修饰成员变量 2.static修饰静态成员函数 引子: 静态成员函数: 注意: 3.const 修饰静态成员 静态成员案例 案例1:静态成员 统计类 实例化 ...

最新文章

  1. 我的第一个 JSP (SSH) 个人网站【开源】
  2. golang sqlite数据库 rows.Close()造成 错误database is locked
  3. 基于Boost::beast模块的协程HTTP服务器
  4. Android doc译文|Building Apps with Content Sharing|Sharing Simple Data
  5. Android学习_ContentProvider和Uri
  6. 10.程序员的自我修养---内存
  7. linux centos系统清理垃圾,centos 清理内存缓存
  8. 【手记】解决Intel Management Engine Interface黄色感叹号
  9. call、aplay 和 bind 三者之间的区别?
  10. 2020vue面试题汇总
  11. 基于深度学习的Depth and Ego-Motion Estimation
  12. Day9-Python文本数据(DataWhale)
  13. 【剑指offer】一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  14. 抽象类和抽象方法_30酷抽象和背景Photoshop教程
  15. C++寻找数组最大值和最小值
  16. “啪”一炮就通!管道疏通神器终于诞生,马桶、下水道再也不怕堵!
  17. Ubuntu20.04网络配置
  18. CCF-CSP201812-1 小明上学
  19. 华大(现在改名小华半导体)芯片启动文件详细讲解
  20. 【MYSQL数据库基础篇第一部分总结】

热门文章

  1. PP视频如何设置关闭的时候直接退出程序
  2. 解决Springboot get请求是参数过长的情况
  3. Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)
  4. mysql——decimal类型与decimal长度
  5. 使用Collections.emptyList()生成的List不支持add方法___Java Collections.emptyList方法的使用及注意事项
  6. SpringBoot中使用Shiro和JWT做认证和鉴权
  7. springboot整合mybatisplus中@Mapper与@MapperScan的使用
  8. jmeter生成html报告修改,Jmeter生成html报告(示例代码)
  9. hough变换直线检测_python+opencv实现霍夫变换检测直线
  10. C语言的VC开发环境界面介绍,【c语言在vc++6.0中编写界面程序】