使用静态数据成员的优势:
- 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
- 可以实现信息隐藏,静态成员可以是private成员,而全局对象不能。
- 静态数据成员不属于任何对象,不因对象的建立而产生,也不因对象的析构而删除
- 它是类定义的一部分,故使用静态数据成员不会破坏类的隐蔽性
- 要使用必须进行初始化,其初始化不能在构造函数中进行。
- 静态数据成员的初始化在类体外(文件作用域内)进行,前面不加static
- 对于非静态数据成员,每个类对象都有自己的副本,而静态数据成员对每个类类型只有这一个副本。——————> 因此该类类型所有对象共享访问
静态成员就是再成员变量和成员函数前面加上关键字static
静态成员变量
- 所有对象共享一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员变量也是有访问权限的
- 静态成员变量可以通过类名和对象进行访问
静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量,不能访问非静态成员函数变量(无法区分到底是哪个对象上的数据)
- 静态成员函数也是有访问权限的
- 静态成员函数可以通过类名和对象进行访问
注:对于静态成员函数不能访问非静态成员函数变量可以这样理解:由于非静态成员变量必须有一个对象指向它才能访问,而静态成员变量是共享一份数据,这份数据可以是任何对象,那么非静态成员变量就分不清是哪个对象访问的它
#include <iostream>
using namespace std;
class Person
{
public:
//静态成员函数
static void func()
{
m_a = 100 ;//静态成员函数可以访问 ————> 静态的成员变量
cout << "static void func调用"<<endl;
}
static int m_a; //静态成员变量,类内声明
//静态成员函数也是有访问权限的
};
int Person :: m_a =0;//类外初始化
//静态成员函数有两种访问方式
void test01()
{
//1. 通过对象访问
Person p;
p.func();
//2.通过类名访问
Person::func();
}
//静态成员变量有两种访问方式
void test02()
{
//1.通过对象
Person p1;
p1.m_a = 100;
cout << "p1.m_a = " << p1.m_a << endl;
//2.通过类名
cout << "m_a" << Person :: m_a <<endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
小结:
-
静态数据成员初始化的格式如下:
- <类型><类名>::<静态数据成员>=<值>;
-
在引用静态数据成员时采用以下格式:
- <类名> :: <静态数据成员>
- <对象名>.<静态数据成员>