C++面向对象编程中,静态成员也是较为重要的。
C++的变量存储区除了堆区和栈区之外,还存在静态存储区,用于存放static静态变量,全局变量以及常量,生命周期是从程序开始运行到结束。
下面分两个部分,静态成员和静态成员函数来讲解:
静态成员
- 所有对象共享同一份数据。
- 在编译阶段分配内存。
- 类内声明,类外初始化。
那么何为类内声明,类外初始化呢?
//test.cpp
#include <stdio.h>
class A {
public:
static int a; //声明但未定义
};
int main() {
printf("%d", A::a);
return 0;
}
首先这里的初始化不是指定义变量或者赋值,而是分配内存空间,上述示例运行结果将会报错,原因就是静态变量没有类外初始化。我们再看下面一个例子
//test.cpp
#include <stdio.h>
class A {
public:
static int a; //声明但未定义
};
int A::a; //定义了静态成员变量,同时初始化。也可以写"int A:a;",即不给初值,同样可以通过编译
int main() {
printf("%d", A::a);
return 0;
}
这里即使不对A::a赋值,也能输出结果,因此这里的初始化,指分配内存,而不是赋值。
静态成员函数
- 前面加上static。
- 所有对象共享同一个函数。
- 静态成员函数只能访问静态成员变量。
- 静态成员函数类内类外均可实现
调用方法:
1、通过对象访问:类对象.函数(class.fun)
2、通过类名访问:类名::函数(class::fun)
这里同样要说明的是,为什么静态函数只能调用静态变量?
这需要结合上面的静态成员来解释
- 首先,静态成员是所有对象共享,它不属于某个类的对象,在没有进行实例化时,静态成员变量就已经存在。
- 其次,非静态成员必须在类的对象创建时才会分配内存。
- 所以,静态成员函数是“看不见”非静态成员变量的。
C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数是没有this指针的,且不接受隐含的this自变量,无法访问自己类的非静态成员。
使用静态成员的优点: 静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。
如果我所写内容存在问题,欢迎讨论,如果有所帮助,希望点赞,收藏加关注,我们一起努力!!