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

关于在类中使用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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值