9. 静态成员

使用静态数据成员的优势:

  • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
  • 可以实现信息隐藏,静态成员可以是private成员,而全局对象不能。
  • 静态数据成员不属于任何对象,不因对象的建立而产生,也不因对象的析构而删除
  • 它是类定义的一部分,故使用静态数据成员不会破坏类的隐蔽性
  • 要使用必须进行初始化,其初始化不能在构造函数中进行
  • 静态数据成员的初始化在类体外(文件作用域内)进行,前面不加static
  • 对于非静态数据成员,每个类对象都有自己的副本,而静态数据成员对每个类类型只有这一个副本。——————> 因此该类类型所有对象共享访问


    静态成员就是再成员变量和成员函数前面加上关键字static

静态成员变量

  1. 所有对象共享一份数据
  2. 在编译阶段分配内存
  3. 类内声明,类外初始化
  4. 静态成员变量也是有访问权限
  5. 静态成员变量可以通过类名和对象进行访问

静态成员函数

  1. 所有对象共享同一个函数
  2. 静态成员函数只能访问静态成员变量,不能访问非静态成员函数变量(无法区分到底是哪个对象上的数据)
  3. 静态成员函数也是有访问权限
  4. 静态成员函数可以通过类名和对象进行访问

注:对于静态成员函数不能访问非静态成员函数变量可以这样理解:由于非静态成员变量必须有一个对象指向它才能访问,而静态成员变量是共享一份数据,这份数据可以是任何对象,那么非静态成员变量就分不清是哪个对象访问的它


#include <iostream>
using namespace std;
class Person
{
public:
    //静态成员函数
    static void func()
    {
        m_a = 100 ;//静态成员函数可以访问 ————> 静态的成员变量
        cout << "static void func调用"<<endl;
    }
    static int m_a; //静态成员变量,类内声明
    //静态成员函数也是有访问权限的
};
int Person :: m_a =0;//类外初始化

//静态成员函数有两种访问方式
void test01()
{
    //1. 通过对象访问
    Person p;
    p.func();
    //2.通过类名访问
    Person::func();
}

//静态成员变量有两种访问方式
void test02()
{
    //1.通过对象
    Person p1;
    p1.m_a = 100;
    cout << "p1.m_a = " << p1.m_a << endl;

    //2.通过类名
    cout << "m_a" << Person :: m_a <<endl;
}
int main()
{
    test01();
    test02();
    system("pause");
    return 0;
}

小结:

  • 静态数据成员初始化的格式如下:

    • <类型><类名>::<静态数据成员>=<值>;
  • 在引用静态数据成员时采用以下格式:

    • <类名> :: <静态数据成员>
    • <对象名>.<静态数据成员>
哪有什么胜利可言,坚持意味着一切
原文地址:https://www.cnblogs.com/BY1314/p/12809826.html