问题引入:
假如一个班中又有一个学生类,学生类中有一个成员变量是总班级人数,现插班进来一个,怎么保证所有学生对象中的总人数一致变化。
为了解决这个问题,总人数相关的变量应该被所有学生共享。最简单的办法是用static修饰,让其变为静态成员变量。
静态成员变量特点:
1.静态成员变量不属于任何一个对象,它单独保存在类的外面,且独有一份,但是所有成员都能访问他,访问它不需要人this指针
2.不能在类对象初始化时或者成员函数调用时进行初始化,必须单独初始化。
class A
{
static int familyNUM; //静态成员变量声明
public:
A()
{
familyNUM++;
}
void check()
{
cout << familyNUM <<endl;
}
};
int A::familyNUM=0; //初始化
int main()
{
A a;
a.check(); //输出 1
A b;
b.check(); //输出 2
}
3.当静态成员变量被public修饰后,可以不依赖对象直接进行访问,访问格式:类名::静态成员变量名。
public: static int familyNUM; //公开静态成员变量声明
int main()
{
A::familyNUM++; //静态的可以在对象实例化前就进行访问
A a;
a.check(); //输出 2
}
4.类的静态成员函数只能访问类的静态成员变量,因为非静态成员变量只有对象存在才有意义。
当静态对象诞生时其构造函数被执行,当程序要结束时,析构函数才执行,随进程持续性。
错误示例:
class A
{
int familyNUM; //公开静态成员变量声明
public:
A(int x)
{
familyNUM=x;
}
static void check()
{
cout << familyNUM <<endl;
}
};
int A::familyNUM=0; //初始化
// A a;
// a.check(); //输出 1
// A b;
// b.check(); //输出 2
int main()
{
A::familyNUM++; //静态的可以在对象实例化前就进行访问
A a(3);
a.check();
}
运行结果:invalid use of member 'A::n' in static member function
延申:为什么C++很少使用全局变量共享数据
(1)全局变量不符合面向对象思想
(2)同类不同对象可以用静态成员变量共享
(3)不同类的对象之间要共享数据,一般使用容器(堆空间),然后以传递地址的方式访问。
链接:容器(待补)
下一章节:C++友元函数和友元类(C++ friend关键字)(链接待补)