2.10 静态成员
-
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 返回类型 函数名(形参表) {...} };
注意:
- 静态成员函数可以直接定义在类的内部,也可以定义在类的外部,这一点和普通的成员函数没有区别。
- 静态成员函数没有this指针,也没有const属性,可以把静态函数理解为被限制在类中使用的全局函数。
- 静态成员函数中只能访问静态成员,但是在非静态成员函数中既可以访问静态成员也可以访问非静态成员。
- 静态成员函数和静态成员变量一样,也要受到类的访问控制限定符的约束。
在类的外部访问静态成员函数
- 类名::静态成员函数(实参表);
- 对象.静态成员函数(实参表);
#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; }