[C++] C++之static

局部对象

形参和函数体内部定义的变量统称为局部变量

  • 局部静态对象

    令局部变量的生命周期贯穿函数调用以及之后的时间。

    可以将局部变量定义成static类型

    局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。

    代码举例:

    size_t count_calls() {
        static size_t ctr = 0;//调用结束后这个值仍然有效
        return ++ctr;
    }
    

    如果局部静态变量没有显式的初始化,它将执行值初始化,内置类型的局部静态变量初始化为0。

类的静态成员

一些成员与类本身直接相关,而不是与类的各个对象保持关联

  • 声明静态成员

    在成员的声明之前加上static关键字,使得其与类关联起来。

    • 静态成员也可以是public或者private的
    • 静态成员的类型可以是常量、引用、指针、类类型等
    class A {
        public:
        	void caculate() {a += a * b;}
        	static double fun1() {return b;}
        	static void fun1(double);//在类外定义该静态成员函数
        private:
        	std::string name;
        	double a;
        	static double b;
        	static double init_b();
    };
    //每个A对象将包含两个数据成员:name和a。只存在一个b成员,而且b被所有A对象共享
    //静态成员函数也不与任何对象绑定,它们不包含this指针,也不能在static函数体内使用this指针
    

    类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据

  • 使用类的静态成员

    • 使用作用域运算符直接访问静态成员:

      double r;
      r = A::fun1();
      
    • 使用类对象、引用、指针来访问静态成员:

      A aa;
      A *bb = &aa;
      double r;
      r = aa.fun1();//通过A对象或者引用访问静态成员函数
      r = bb -> fun1();//通过指向A对象的指针访问静态成员函数
      
    • 静态成员函数不通过作用域运算符就能直接使用静态成员

      void caculate() {a += a * b;}
      
  • 定义静态成员

    我们既可以在类的内部定义静态成员函数,也可以在类的外部定义静态成员函数。

    当在类的外部定义静态成员函数时,不能重复使用static关键字,该关键字只能出现在类内的声明语句

    指向类外部的静态成员时,必须指明所属的类名

    //在类外定义静态成员函数void fun1(double);
    void A::fun1(double num) {
        b = num;
    }
    
    //在类外定义静态数据成员b
    double A::b = init_b();
    

继承与静态成员

静态类型在编译时是已知的

如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义。

如果基类中的静态成员是private的,则派生类无权访问它

class base {
    public:
    	static void fun1();
};
class derived : public base {
	void fun2(derived&);  
}; 

derived derived_obj;
base::fun1();//正确,通过类名访问
derived::fun1();//正确,通过类名访问
derived_obj.fun1();//正确,通过derived对象访问,派生类对象能访问基类的静态成员
fun1();//正确,通过this对象访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值