本篇文章主要讲解C++基础中static关键字的静态成员函数并进行实例演示。
一.静态成员函数定义
关于静态成员函数,只要记住以下几个特征,就可以理解它的含义。
1.静态成员函数就是在声明时前面加了 static 关键字的成员函数。
2.静态成员函数没有 this 指针,不知道指向哪个对象,无法访问对象的成员变量。
3.静态成员函数可以通过类来直接调用(或者通过对象名.函数名)。
4.静态成员变量只有一份,被所有同类对象共享。
编译器编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用静态成员函数。
二.实例演示静态成员函数的定义及调用
Test.h
class Staff{
public:
Staff(char *name, int age, int salary);
public:
static int getTotalStaff();
static int getTotalSalary();
private:
static int m_staff;
static int m_salary;
char* name;
int age;
int salary;
};
Test.cpp
int Staff::m_staff=0;
int Staff::m_salary=0;
Staff::Staff(char *name, int age, int salary)
{
m_staff++;
m_salary+=salary;
cout<<name<<"年龄"<<age<<",薪水是"<<salary<<endl;
}
int Staff::getTotalSalary()
{
return m_salary;
}
int Staff::getTotalStaff()
{
return m_staff;
}
int main()
{
Staff staff1("员工小明",25,13000);
Staff staff2("技术经理",30,300000);
Staff staff3("主管",45,500000);
int totalstaff = Staff::getTotalStaff();
int totalsalary = Staff::getTotalSalary();
cout<<"当前共有"<<totalstaff<<"员工,总薪资是"<<totalsalary<<",平均年薪是"<<totalsalary/totalstaff<<endl;
return 0;
}
结果:
分析:
这是一个计算公司员工平均薪水的案例,其中定义了静态成员变量:总员工数和总薪资,这两个变量为类所拥有,为该类的所有实例共享,只要有一个实例,就会记录员工数和薪水;还定义了两个静态成员函数,获取薪水总和,获取员工总和。
我们可以看到,静态成员函数可以直接使用类名::函数名直接调用。
在这里的静态成员变量和静态成员函数的作用为实现各个对象数据的共享,通常情况,普通成员变量和函数在各个对象之间互不影响。因此,静态成员变量和静态成员函数成为了不同对象间的桥梁,静态成员变量可以记录对象的变化,统计对象的生成数量等等。
三.静态成员函数的作用
1.单例模式
单例模式是使用最广泛的设计模式之一。为了保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。如系统的日志输出,一台PC连一个键盘和鼠标。单例模式的作用是控制实例数量节约系统资源。
2.函数封装
对于一些系统函数或者数学函数,这些函数都是属于此类的,没必要属于任何一个对象。
3.回调函数的封装
由于没有this指针,可以把某些系统的回调函数以静态函数的形式封装到类的内部。
4.一切不需要实例化就有确定行为方式的函数都应该设计成静态的。