【C++】static的用法详解

1.什么是static?

static是c++常用的修饰符,它用来控制变量的存储方式和可见性。

2.为什么要引入static

函数内部定义的局部变量,在程序执行到定义点时,编译器为它在栈上分配空间,但此函数执行结束后空间会被释放回收。这样就会产生一个问题:如果想要将函数中的此变量的值保存至下一次调用时,如何实现?最容易想到的方法时定义一个全局变量,但定义一个全局变量有许多缺点,最明显的是破坏了此变量的访问范围,使得在函数中定义的变量,不仅仅受此函数控制。

静态局部变量正好解决了这个问题,静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下一次赋新值。

3.static使用环境

需要一个数据对象为整个类而非某个对象服务,同时力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

4.static的作用

1)静态局部变量:用于函数体内部修饰局部变量,使该变量的生存周期长于该函数(即不会随着函数的结束而销毁)。

 静态局部变量是在第一次使用时进行初始化,且只初始化一次,第二次调用时,不会继续初始化,而会直接跳过。

静态局部变量和局部变量的区别:

1)静态局部变量在全局数据区分配内存;局部变量在战区分配内存

2)静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用不会再进行初始化;局部变量每次函数调用都会被初始化

3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;局部变量不会被初始化

4)静态局部变量的生存周期直到程序运行结束,但作用域为函数体内部,不能在函数体外使用它;局部变量在函数结束后立即释放内存

2)静态全局变量:定义在函数体外,用于修饰全局变量,表示变量只在本文件可见。

 上图为1.c通过extern使用了2.c定义的全局变量;而将2.c全局变量修改成静态局部变量,则会出现下图结果

因为static进行了文件隔离,1.c无法访问2.c定义的静态全局变量

3)静态函数:作用和静态全局变量类似,使函数不能被其他文件所用,其他文件中可以定义相同名字的函数,不会发生冲突。

4)静态成员变量:用于修饰类的数据成员。这种数据成员的生存周期大于class的对象。静态数据成员是每个class有一份,普通数据成员是每个对象有一份,因此静态数据成员也叫做类变量,而普通数据成员叫做实例变量。

 注意:静态成员变量不占类的空间,它是在全局数据区(静态区)分配内存。

对于非静态数据成员,每个对象都有自己的拷贝,而静态数据成员被当作类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存。

5)静态成员函数:用于修饰类的成员函数。

 对Getsum()加上static,使之成为一个静态成员函数,可以用类名::函数名访问

静态成员的特点:

1.静态成员之间可以相互访问,静态成员函数可以访问静态数据成员和静态成员函数;静态成员函数不能访问非静态成员函数和非静态数据成员;非静态成员函数可以任意访问静态成员函数和静态数据成员;

2.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值