静态成员变量
在定义类中的成员变量时,如果我们想保持这个成员的独立性,我们可以用static关键字将其定义为静态的,这就意味着不论创建多少个成员变量,该静态成员只有一个。
与静态变量相似,静态成员变量只能初始化一次,都在内存分区中的全局数据区分配内存,到程序结束时才释放。这就意味着,static成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
静态变量初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为0,。全局数据区的变量都有默认的初始值0,而堆区、栈区变量的默认值是不确定的,系统会给这个变量自动赋一个随机的值。
- 静态成员变量属于整个类所有,所有对象共享类的静态成员变量
- 静态成员变量需要在类外初始化(必须初始化,可以不赋值例如 int A::a = 1)
- 可以通过类名直接访问共有静态成员变量
- 可以通过对象名访问共有静态成员变量
- 静态成员变量在程序内部位于全局数据区(静态区)
- 静态成员变量的生命期不依赖于任何对象,与程序的生命周期一致
- 静态成员变量不会被继承,父类和子类共享静态成员变量
- 静态成员不会影响类的大小
#include<iostream>
using namespace std;
class A {/*类在刚创建的时候系统会提供一个字节大小的占位符 即sizeof(一个空的类) = 1*/
public:
static int a;
};
int A::a = 1;
int main() {
A a, b, c;
a.a++;
b.a++;
c.a++;
A::a++;
cout << a.a << endl;/* 5 */
return 0;
}
静态成员函数
- 定义静态成员函数,直接使用static关键字修饰即可,静态成员函数属于整个类所有,没有this指针
- 静态成员函数智能直接访问静态成员变量和静态成员函数(没有this指针,访问普通的成员变量和成员函数中都会自动把this指针隐藏)和类外部的其他元素。
- 可以通过类名直接访问静态成员函数
- 可以通过对象名访问类的共有静态成员函数
#include<iostream>
using namespace std;
class A {
int a;
public:
void work() {//this会当做隐藏参数传进
a = 1;//省略了this this->a = 1
}
static int b;
static void fun() {
//静态函数没有this指针 属于整个类 不属于某个对象
//静态成员函数可调用静态成员函数
//静态成员函数可以调用静态成员变量
//可以通过类名+作用域直接访问类的共有静态函数
//可以通过对象直接访问共有静态函数
//a=3 错误 因为非静态成员变量需要创建成员对象的时候才分配空间 而静态成员变量在创建成员对象之前就已经存在了 有冲突
b++;
}
};
int A::b = 1;//静态成员变量在类外初始化
int main() {
A a, b, c;
a.fun();
b.fun();
c.fun();
A::fun();
cout << a.b << endl;
}