C++为什么需要静态成员
C语言中可以通过全局变量实现数据共享,在程序的任何位置都可以访问
C++中希望某个类的多个对象实现数据共享,可以通过static建立一个被局限在类中使用的全局资源,该类型资源被称为静态成员。
静态成员变量(可以理解为局限在类中使用的全局变量)
被static修饰的成员变量即为静态成员变量
class 类名{
static 数据类型 变量名;//声明
};
数据类型 类名::变量名 = 初值;//定义和初始化
实例化对象时只实现非静态成员变量
访问方式:
#include <iostream>
using namespace std;
class A{
public:
static int m_a;//类名A 创建的对象共享此 静态成员变量
int m_b;
A(int data = 0) : m_b(data){}
};
int A::m_a = 10;//定义 并 初始化成员变量
int main(void) {
cout << A::m_a << endl;
A a1;
cout << "A size() = " << sizeof(a1) << endl; //输出 A size() = 4
cout << a1.m_a << endl;
A a2;
cout << a2.m_a << endl;
return 0;
}
静态成员函数
被static修饰的成员成员函数即为静态成员函数。
class 类名{
访问控制限定符:
static 返回类型 函数名(形参表) {...}
};
注意:
在类的外部访问静态成员函数
#include <iostream>
using namespace std;
class A{
public:
int m_data;
static int s_data;
A(int data = 0):m_data(data) {}
void func1(void) { // 编译器翻译了以后 void func1(A *this)
cout << m_data << endl; //可以访问 非静态成员变量
cout << s_data << endl; //可以访问 静态成员变量
}
static void func2() {
//cout << m_data << endl; //不可以访问 非静态成员变量
//cout << this->m_data << endl; 编译器翻译以后 有this指针
cout << s_data << endl; //只能访问 静态成员变量
}
};
int A::s_data = 100;
int main(void) {
A::func2();
A a;
a.func2();
a.func1(); //编译器翻译以后 a.func1(&a) 是传入地址
return 0;
}