静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员变量:
(1)所有对象共享同一份数据:
作为静态成员变量,所储存的变量只有一份,当A对象改变这一数值之后,B对象读取这个数值时即为A对象更改之后的数值。
void test4()
{
person p1;
cout << "person的年龄是" << p1.m_age << endl;
person p2;
p2.m_age = 200;
cout << "person的年龄是" << p1.m_age << endl;
}
此时输出为:
person的年龄是100
person的年龄是200
(2)在编译阶段分配内存:
代码没有运行之前就已经在全局区给这一成员变量分配了一块内存地址。
(3)类内声明,类外初始化
class person
{
public:
//类内声明
static int m_age;
};
//类外初始化,由于类外为一个全局变量,需要注明是peron这一作用域下的一个变量
int person::m_age = 100;
静态成员变量不属于某个对象上,所有对象都共享同一份数据。静态成员有如下两种访问形式:
void test5()
{
//1、通过对象进行访问
person p1;
cout << "person的年龄是" << p1.m_age << endl;
//2、通过类名进行访问
cout << person::m_age << endl;
}
静态成员也是有访问权限的,当一个私有变量为静态变量时,只有类内可以访问该变量,类外是没有权限访问的。样例如下。此时会报错严重性E0265 成员 “person::m_Age” (已声明 所在行数:20) 不可访问。
class person
{
private:
static int m_Age;
};
int person::m_Age = 100;
cout << person::m_Age << endl;
静态成员函数:
(1)、所有对象共享同一函数
静态成员函数不属于某个对象上,所有对象都共享同一份数据。静态函数有如下两种访问形式:
void test6()
{
person p1;
//通过对象访问
p1.func();
//通过类名访问
person::func();
}
(2)、静态成员函数只能访问静态成员变量
非静态成员变量必须通过一个对象才能读和写本块内存,如果对其操作,则无法确定需要对哪个对象下的该变量进行操作。
又因为静态成员函数不属于某个对象上,所有对象都共享同一份数据,不区分所属关系。所以可以对其变量进行操作。
class person
{
public:
//静态成员函数
static void func()
{
m_a = 100;
m_b = 200; //此行会报错:非静态成员引用必须与特定对象相对
cout << "静态函数成员调用" << endl;
}
static int m_a;
int m_b;
};
int person::m_a = 1;
同时,静态函数也是有访问权限的,当一个私有变函数为静态函数时,只有类内可以访问该函数,类外是没有权限访问。