静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
静态成员变量
所有对象共享一份数据
在编译阶段分配内存
类内声明,内外初始化
静态成员函数
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
静态成员变量演示:
class Person
{
public:
static int m_A;
};
int Person::m_A = 100;//内外进行声明
void test01()
{
Person p;
cout << p.m_A << endl;
Person p2;
p2.m_A = 200;
cout << p2.m_A << endl;
cout << p.m_A << endl;
}
int main()
{
test01();
return 0;
}
这段代码输出的结果是:
为什么前后两个p.m_A输出的结果会不一样呢?因为在Person类中创建的是一个静态变量,所有成员都共享一份数据,当执行p2.m_A = 200;时,p.m_A的值也会发生改变。
静态成员变量可以通过对象进行访问,也可以通过类名进行访问(非静态成员变量不行):
class Person
{
public:
static int m_A;
};
int Person::m_A = 100;
void test02()
{
Person p;
cout << p.m_A << endl; //1.通过对象进行访问
cout << Person::m_A << endl; //2.通过类名进行访问问
}
int main()
{
test02();
return 0;
}
两种方式访问的输出结果:
静态成员函数和静态成员变量类似,可以通过对象进行访问,也可以通过类名进行访问
静态成员函数演示:
class Person
{
public:
static void func()
{
cout << "static void func调用" << endl;
}
};
void test01()
{
//1.通过对象进行访问
Person p;
p.func();
//2.通过类名进行访问
Person::func();
}
int main()
{
test01();
return 0;
}
静态成员函数只能访问静态成员变量:
class Person
{
public:
static void func()
{
m_A = 100; //静态成员函数 能访问静态成员变量
//m_B = 200; //静态成员函数 不可已访问 非静态成员变量
cout << "static void func调用" << endl;
}
static int m_A;
int m_B;
};
int Person::m_A = 0;
原因:静态成员变量是所有对象共享的,如果让静态成员函数访问非静态成员变量m_B时,无法区分m_B是属于哪个对象的
注意:静态成员变量和静态成员函数和普通变量一样,都有访问权限。