静态成员变量
static + 成员变量 = 静态成员变量
class Person{
int m_age; //普通成员变量
static int m_birthday; //静态成员变量
};
特点
1、所有对象共享同一份数据
2、在类内声明,一定要在类外初始化
3、可以通过类名直接访问
用 类名::变量名 的方式就可以直接访问静态成员变量
4、在编译阶段分配内存
5、存储在内存中的全局区
class Person{
public:
static int m_age; //静态成员变量
};
int Person::m_age = 18; //一定要初始化,不然会报错
Person p1; //创建对象p1
cout << p1.m_age << endl; //输出p1的年龄 18
Person p2; //创建对象p2
p2.m_age = 22; //将p2的年龄改为 22
cout << p1.m_age << endl; //输出p1的年龄 22 因为所有对象共享同一数据
访问方式
1、通过对象进行访问
2、通过类名进行访问
ps:普通成员变量只能通过对象进行访问
class Person{
int m_age; //非静态成员变量
static int m_birthday; //静态成员变量
};
int Person::m_birthday = 1030; //类外初始化
//1、通过对象访问
Person p1;
p1.m_age = 22; //非静态成员变量 只能通过对象访问
p1.m_birthday = 0202; //访问,修改值
//2、通过类名访问
cout << Person::m_birthday << endl; //访问,打印
静态成员函数
static + 成员函数 = 静态成员函数
class Person{
void func_1(){ } //普通成员函数
static void func_2(){ } //静态成员函数
};
特点
1、程序共享一个函数
2、静态成员函数,只能访问静态成员变量
class Person{
public:
static void func(){
m_age = 22; //这行代码会报错,静态成员函数 只能访问 静态成员变量
m_birthday = 0202;
}
int m_age; //普通成员变量
static int m_birthday; //静态成员变量
};
int Person::m_birthday = 1030; //类外初始化
解释,为什么只能访问静态成员变量:
如果你知道 this指针 的话,那就很好理解,原因就是静态成员函数没有 this指针
比如上面的代码,假如我创建2个对象:Person p1,p2;
当调用静态成员函数时:p1.func( ); p2.func( );
编译器不知道其中的 普通成员变量 m_age 到底是属于p1的还是p2的,因为没有 this指针
但是 m_birthday 就不会有这个问题,因为静态成员变量只有一份数据,不用考虑属于谁
访问方式
1、通过对象访问
2、通过类名访问
class Person{
public:
void func_1(){ //普通成员函数
...
}
static void func_2(){ //静态成员函数
...
}
};
//1、通过对象访问
Person p1;
p1.func_1(); //普通成员函数 只能 通过对象访问
p1.func_2();
//2、通过类名访问
Person::func();