静态成员 就是在成员变量或成员函数前加static,变成静态成员
静态成员分为静态成员变量和静态成员函数
1.静态成员变量:
特点:
1.所有对象共享同一份静态成员变量数据
2.在编译阶段分配内存,在主函数之前构造
3.在类内声明,类外初始化(对象.静态成员变量,或者类::静态成员变量)
4.在发生继承时,静态成员变量不会被继承,子类和父类共享同一份静态成员变量
5.可以通过类或对象访问公有的静态成员变量
6.静态成员变量不占对象的内存
#include<iostream>
using namespace std;
class A {
public:static int a;//静态成员变量在类内声明int b;A() {cout << " 默认构造" << endl;}~A() {cout << " 默认析构" << endl;}void fun();
};
void A::fun() {//在类外实现类内的成员函数,通过作用域来实现cout << "A fun()" << endl;
}
int A::a = 0;//静态成员变量在类外初始化
int main() {A::a++;//a=1,通过类访问静态成员变量A a, b;a.a++;//a=2,通过对象访问静态成员变量b.a++;//a=3cout << a.a << endl;//3,所有对象共享同一份静态成员变量cout << "类A的大小为:" << sizeof(b) << endl;//4,静态成员变量不占对象的内存,单独存放在静态区return 0;
}
2.静态成员函数
特点:
1.静态成员函数只能访问静态成员变量(静态成员函数没有this指针,不能区分成员变量属于哪个对象,所以访问不了非静态成员变量)
2.没有this指针,所以静态成员函数内部不能使用非静态成员变量和非静态成员函数(无法给非静态成员函数的隐含指针this传参)
3.可以通过类或对象访问公有的静态成员变量(与静态成员变量相同)
#include<iostream>
using namespace std;
class A {static int A_m;int B_m;static void fun() {}
public:void work() {B_m = 3;cout << " work" << endl;}static void hhh() {
//B_m = 2;报错,静态成员函数没有this指针,不能区分成员变量属于哪个对象,所以访问不了非静态成员变量
//work(),报错,静态成员函数不能调用非静态成员函数,无法给work()的隐含指针this传参cout << "hhh调用" << endl;}
};
int A::A_m = 0;
int main() {A::hhh();A p;p.hhh();return 0;
}
在主函数之前执行的函数
1.)全局对象的构造函数
2.)静态成员变量的构造函数(静态成员变量实在编译期间进行的)
#include<iostream>
using namespace std;
class A {
public:A() {cout << " 默认构造" << endl;}~A() {cout << " 默认析构" << endl;}
};
class B {
public:static A a;};
A B::a = A();
int main() {cout << "--------" << endl;
}
成员变量和成员函数分开储存
在C++中,类内的成员变量和成员函数分开储存,只有非静态成员变量才属于对象上
#include<iostream>
using namespace std;
class Person {
public:int mA;//非静态成员变量占对象空间static int mB;//静态成员变量不占对象空间,单独放在静态区,供所有对象共享Person() {mA = 0;}void fun() {//成员函数不占对象空间,所有函数共享一个函数示例cout << "mA:" << this->mA << endl;}static void fun1() {//静态成员函数不占对象空间}
};
int main() {cout << sizeof(Person) << endl;return 0;
}