接着上期const修饰类对象写,本期研究静态成员语法,即static修饰类成员和函数
class A
{
private:
const string Name;//常量
int Id;
public:
static int total;//全体学生总数
A(string name, int id) :Name(name), Id(id) { total++; }
~A() { total--; }
//展示学生信息
void showInfo()const
{
cout << "学号: " << Id
<< " 姓名: " << Name << endl;
}
//显示所有学生数量(写类内类外都可以)
static void show_Total()
{
cout << "此时有" << total << "个学生" << endl;
}
};
//必须类外初始化静态成员
int A::total{};//所有由这个类创建的对象全部共享此数据
这里一些涉及到const的语法,不懂的可以去看上期(不懂也不影响本文章观看)C++:枚举循环,全局作用域,子类调用父类函数,const类成员赋值_头发乌黑茂密的博客-优快云博客
这里我们类内声明了一个静态成员变量 total ,这个变量total必须在类外初始化,这里使用{}进行空初始化,也就是0,在构造函数中,每创建一个对象total+1,每析构一个对象,total-1。然后通过静态成员函数show_Total()查看total的值
int main()
{
//可以不通过对象访问类内静态函数
A::show_Total();//total=0
A* p1 = new A("Jack", 1);//创建对象Jack
p1->show_Total();//total=1
delete p1;//注销对象Jack
cout<<A::total<<endl;//total=0
}
静态成员数据(total)和静态函数( show_Total() )既可以通过某个具体类对象(p1)来访问,也可以直接使用类类型(A::)来访问。类静态数据(total)是存储在静态数据区、作用域被限定在类类型中的数据,并且所有类对象共享这一个数据,我们再创建一个对象p2
int main()
{
//可以不通过对象访问类内静态函数
A::show_Total();//total=0
A* p1 = new A("Jack", 1);//创建对象Jack
p1->show_Total();//total=1
A* p2 = new A("Rose", 2);//创建对象Rose
p2->show_Total();//total=2
p2->total = 100;//通过对象修改值
//通过另一个对象调用查看值
p1->show_Total();//total=100
delete p1;//注销对象Jack
cout<<A::total<<endl;//total=99
}
可见,通过p2修改total后,通过p1去查看该数据,数据跟修改后是一致的 .
关于这个静态成员函数show_Total(),我们在这个函数里面是不能调用任何非静态类成员属性和非静态类成员函数,而且也不能使用this指针,因为this指针只能在非静态函数内部.我们在这个函数内只能通过类作用域访问其它静态类成员和静态类函数