静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
1.静态成员变量
所有对象共享同一份数据
在编译阶段分配内存
类内声明,类外初始化
2.静态成员函数
所有对象共享一个函数
静态成员函数只能访问静态成员变量
示例1:静态成员变量
原代码
#include<iostream>
using namespace std;
//静态成员变量
class Person
{
public:
//1 所有对象都共享同一份数据
//2 编译阶段就分配了内存 (在全局区)
//3 类内声明,类外初始化操作
static int m_A;
//静态成员变量也是有访问权限的
private://私有变量和函数,类外不可以访问
static int m_B;
};
int Person::m_A = 100;//类外初始化,说明是Person作用域下面的静态成员
int Person::m_B = 300;
void test01()
{
Person p;
//100
cout << p.m_A << endl;
Person p2;
p2.m_A = 200;
//200 用对象p访问也是200,对象p和对象p2共享m_A这一个静态成员,m_A在内存中只有一份
cout << p.m_A << endl;
}
void test02()
{
//静态成员变量 不属于某个对象上,所有对象都共享同一份数据
//因此静态成员变量有两种访问方式
//1.通过对象进行访问
Person p3;
cout << p3.m_A << endl;
//2.通过类名进行访问
cout << Person::m_A << endl;
//cout << Person::m_B << endl; 错误,类外访问不到私有的静态成员
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
运行结果
示例2:静态成员函数
原代码
#include<iostream>
using namespace std;
//静态成员函数
//1 所有对象都共享同一个函数
//2 静态成员函数只能访问静态成员变量
class Person
{
public:
//静态成员变量
static int m_A;//类内声明,类外初始化
//普通成员变量
int m_B;
//静态成员函数
static void func()
{
m_A = 100; //静态成员函数可以访问静态的成员变量
//m_B = 200; //错误 非静态成员引用必须与特定对象相对 说明静态成员函数不可以访问非静态成员变量
/*报错的原因是: 静态成员变量m_A和静态成员函数func在内存中都只有一份,所以静态成员函数可以直接访问静态成员变量
而 m_B是非静态成员变量,必须要靠对象来进行访问,每创建一个对象,就会有一个对应的m_B,所以编译器不知道此处改变
的是哪一个对象对应的m_B的值*/
cout << "static void func的调用" << endl;
}
//静态成员函数也是有访问权限的
private:
static void func2()
{
cout << "static void func2的调用" << endl;
}
};
int Person::m_A = 0;
//静态成员函数也有两种访问方式
void test01()
{
//1. 通过对象访问
Person p;
p.func();
//2. 通过类名访问
Person::func();
//Person::func2(); 类外访问不到私有的静态成员函数
}
void test02()
{
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
运行结果