静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。
静态成员分为:
静态成员变量
- 所有对象共同分享同一数据
- 在编译阶段分配内存(全局区)
- 类内声明,类外初始化(注意表现形式)
1.通过对象访问
2.通过类名访问
class person
{
public:
static int m_age; //静态成员变量的类内声明
private:
static int m_tel; //也有权限的设置
};
int person::m_age = 100;//类外初始化
int person::m_tel = 100;
int main()
{
person p;
cout << p.m_age << endl; //静态成员变量未初始化。必须类内声明,类外初始化
person p2;
p2.m_age = 1;
cout << p.m_age << endl; //这里依然用的p.m_age,但因为所有对象共享同一数据,所以p2改变了,p也变
cout << person::m_age << endl; //直接通过类名访问
system("pause");
return 0;
}
静态成员函数
- 所有对象共享同一个函数
- 静态成员函数只能访问静态成员变量
//静态成员函数可以访问静态成员变量。因为这个是共享的,不需要特定对象,都可以用
//asd = 1000; //但不可访问非静态成员变量。
//因为类[的所有对象共享同一函数,而非静态成员变量必须有一个特定对象才能访问。
//所以将非静态成员变量放进静态成员函数时,如果调用这个函数,不知道是改变的哪一个对象上的非静态成员变量。就是有了特定对象后,才给这个非静态属性分配内存
(待修改)
class person
{
public:
static void func()
{
m_age = 100; //静态成员函数可以访问静态成员变量。因为这个是共享的,不需要特定对象,都可以用
//asd = 1000; //但不可访问非静态成员变量。
//因为类的所有对象共享同一函数,而非静态成员变量必须有一个特定对象来访问。
//所以将非静态成员变量放进静态成员函数时,如果调用这个函数,不知道是改变的哪一个对象上的
//非静态成员变量
cout << "静态成员函数的调用" << endl;
}
static int m_age;
int asd; //非静态成员变量
};
void test()
{
//1.通过对象访问
person p;
p.func();
//2.通过类名访问
person::func();
}
int person::m_age = 11;
int main()
{
test();
person p;
system("pause");
return 0;
}
3.成员变量和成员函数分开存储
sizeof(p);空对象时占用内存空间为1
C++编译器给每个空对象分配1个字节的内存,是为了区分空对象占内存的位置,独一无二的内存地址
class person
{
int b;//4个字节,在类的对象上(特定对象)
static int b ; //4个字节,静态成员变量不属于类的对象(都可以用)
void func(){} //非静态成员函数,不属于类的对象
static void func(){} //静态成员函数不属于类的对象
属于类的对象解释:
空类,即class person
{
}
void test()
{
person p;
cout << sizeof(p) << endl; //因为是空对象,所以占用内存为1字节
}
但在class person中加了一个属性int b后,sizeof(p)的内存由1变成了4字节,所以非静态成员变量在类的对象上。
继续加static int b ; void func(){} ;static void func(){} ;sizeof(p)依然为4个字节大小。所以这三个不在类的对象上。
所以成员变量和成员函数是分开存储的