1、C++中定义静态成员变量
(1)静态成员属于整个类所有,不是隶属于某个对象所有;
(2)静态成员变量的生命周期不依赖于任何对象,其生命周期如同全局变量一样,静态成员变量的生命周期是程序的运行周期;
(3)可通过类名直接访问共有静态成员变量,静态成员变量也有访问等级;
(4)所有对象共享类的静态成员变量,所以可通过对象名访问公有静态成员变量。
2、静态成员变量的特性
(1)在定义成员变量时直接通过static关键字修饰;
(2)静态成员变量需要在类外单独分配空间,其隶属于整个类,不能占用对象的空间,只能在类的外部单独分配空间;
(3)静态成员变量在程序内部位于全局数据区。全局数据区保存已初始化的全局变量或静态局部变量;静态成员变量和全局变量、静态局部变量是一致的,存储在同一个地方,但只有在类的外部重新定义静态成员变量才可存储到静态存储区,然后才可在成员函数中使用;今天存储变量一般会初始化,所以存储在全局数据区区;
(4)在类外直接定义静态成员变量:
Type ClassName::VarName = value;
例:
main.cpp
#include <iostream>
#include "staitcMethod.h"
using namespace std;
int main()
{
StaticClass sat;
// sat.staticMethod(); // 静态成员函数可使用类对象来调用
StaticClass::staticMethod(); // 静态成员函数也直接使用类来调用
sat.func();
system("pause");
return 0;
}
staticMethod.h
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// C++中类的静态成员变量
class StaticClass
{
public:
StaticClass() {}
~StaticClass() {}
static void staticMethod();
static void staticPrint(int i);
void func();
private:
static int s_int;
static vector<string> s_vec;
vector<string> m_vec;
};
staticMethod.cpp
#include "staitcMethod.h"
// 此处为关键,不管在静态还是非静态成员函数中使用静态成员变量都需要在类外单独定义一下该类中的静态成员变量后方可使用;
// 静态成员变量不像静态局部变量一样可以直接保存到静态存储区,所以还要在类外部定义静态存储变量,以便能够给其分配到静态存储区里面;
// 要用作用域分辨符告诉编译器 s_int 隶属于 StaticClass 这个类;
int StaticClass::s_int = 0;
vector<string> StaticClass::s_vec;
void StaticClass::staticPrint(int i)
{
cout << "调用静态成员函数:" << i<< endl;
}
void StaticClass::staticMethod()
{
string s1 = "s1";
// 在静态成员函数中使用非静态成员变量时需要使用其所属类的对象来调用
StaticClass sta;
sta.m_vec.push_back(s1);
for (auto it = sta.m_vec.begin(); it != sta.m_vec.end(); it++) {
cout << "静态成员函数中调用非静态成员变量:" << *it << endl;
}
// 在静态成员函数中使用静态成员变量时,该静态成员变量需要在类外再次定义后才可使用
s_vec.push_back(s1);
for (auto it2 = s_vec.begin(); it2 != s_vec.end(); it2++) {
cout << "静态成员函数中调用静态成员变量:" << *it2 << endl;
}
// s_int = 1;
// sta.s_int = 66; // 也可使用类对象来访问其中的静态成员变量
// cout << s_int << endl;
staticPrint(11);
}
void StaticClass::func()
{
s_int = 99; // 非静态成员函数中可直接使用类中静态成员变量
cout << "非静态成员函数中调用静态成员变量:" <<s_int << endl;
staticPrint(22);
}
输出: