static 静态成员变量 静态成员函数 类中使用

    技术2026-04-24  6

    关于在类中使用static的一些情况:

     

    静态成员函数和静态成员变量的调用格式,尽量采用类名::成员的格式,不要以对象来调用

    1. static func静态成员函数

      1) 其地址可以直接由函数指针来存储,普通函数其地址只能是由类中的函数指针来存储,如:    class base{          static int func1();          int func2();     };

        int (*pf1)()=&base::func1;//普通的函数指针     int (base::*pf2)()=&base::func2;//成员函数指针

        这也就是说,如果在类外面去存储类中的函数指针,以便在某个时机去调用的话,只能将该函数声明为static的(注意:尝试去取对象的普通成员函数地址是非法的)。

        常见的场景是:        a. 类中的某个函数要被注册成类外的回调函数,由于要存储类中的函数指针,只能将该函数声明称静态的。        b. 创建线程(类内或外),要传递函数指针,也需要声明称static的,原理都是一样的。     总结:如果在逻辑处理到类外时需要存储类中某函数的地址,则需要将该函数声明称static的。     常见的就是:在类内或类外调用某个函数,要求传递函数指针,那么要传递类中的函数,只能声明称static的,这样才可以让参数的局部变量来存储它,如回调函数。

      2) 静态成员函数由于是类级别的,不含this指针,故不能直接访问类中的普通成员变量,但可以在函数中加上对象的引用,来控制访问哪个对象的普通成员变量,当然,是可以访问static 成员变量的。

          这个也可以从取地址的角度来分析:      当静态成员函数尝试直接访问普通成员变量时,它首先要确认普通成员变量的内存地址,但由于没有this指针,该普通成员变量是无效的,不属于对象的,故无法找到它的地址,故无法访问。

      3) 静态成员函数不能加任何修饰符,如const,virtual, volatile等。

     

    2. static member静态成员变量

       1) 实质是全局对象的概念,只是放在类中,多了访问控制用域的概念,对类的所有对象共享,类外,也可以想办法访问。故其定义(初始化)不要放在头文件中,否则会报连接错误,重复定义。   2) 可以作为成员函数的缺省参数,普通成员函数不行,如   class base{     public :             static int _staticVar;             int _var;             void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员             void foo2(int i=_var);//错误,_var为普通数据成员    };

       3)静态成员变量的类型可以是所属类的类型,普通的成员变量不行,只能是指针或引用,如

       class base{    public :            static base _object1;//正确,静态数据成员            base _object2;//错误            base *pObject;//正确,指针            base &mObject;//正确,引用    };   4)静态成员变量不受const成员函数限制,可以被修改。

         

    最新回复(0)