C++中的Static关键词


在C++中static关键词的作用可以分成面向过程设计和面向对象设计两部分考虑。

一、static关键词在面向过程设计中的作用

显然,static关键词在面向过程设计中的作用继承自C语言。

1、修饰局部变量

当用stati关键词修饰局部变量后,我们先观察一下局部变量的存储位置、生命期和作用域有什么变化:
修饰前的存储位置:栈区
修饰后的存储位置:静态区
修饰前的生存期:和函数的生命周期是一样的,函数结束则它的生命周期结束。
修饰后的生存期:和程序的生命周期是一样的,程序结束则它的生命周期结束。
修饰前的作用域:函数范围内
修饰后的作用域:函数范围内
如上所示:局部变量被static修饰后生命期发生了变化。对于栈区的变量,函数出栈时会自动栈清除,静态区的变量则不会被清除。因此,当你想保留函数内部局部变量的值时,例如确定函数调用次数时,可以使用静态局部变量。

2、修饰全局变量

当用stati关键词修饰局部变量后,我们先观察一下局部变量的存储位置、生命期和作用域有什么变化:
修饰前的存储位置:静态区
修饰后的存储位置:静态区
修饰前的生存期:和程序的生命周期是一样的,程序结束则它的生命周期结束。
修饰后的生存期:和程序的生命周期是一样的,程序结束则它的生命周期结束。
修饰前的作用域:整个程序
修饰后的作用域:当前源文件
如上所示:全局变量被static修饰后作用域发生了变化。一个全局变量本来是有外部链接属性的,即被extern关键词修饰。但是被static修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用。
因此,当你想在其他源文件调用该全局变量时,可以使用静态全局变量。但是,当你想在不同源文件命名相同的名字的全局变量时,为了不发生冲突,你不应该使用静态全局变量。

3、修饰普通函数

当用stati关键词修饰局部变量后,我们先观察一下普通函数的作用域有什么变化:
修饰前的作用域:整个程序
修饰后的作用域:当前源文件
如上所示:局部变量被static修饰后作用域发生了变化。与全局变量相似,一个普通函数本来是有外部链接属性的,即被extern关键词修饰。但是被static修饰后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用,不能在其他文件内部使用。
因此,当你想在其他源文件调用该全局变量普通函数时,不可以使用静态函数。但是,当你想在不同源文件命名相同的名字的普通函数时,为了不发生冲突,你应该使用静态函数。

二、static关键词在面向对象设计中的作用

1、修饰类的成员变量

当用stati关键词修饰类的成员变量后,我们先观察一下类的成员变量的存储位置、生命期和使用范围有什么变化:
修饰前的存储位置:由对象的创建方式决定
修饰后的存储位置:静态区
修饰前的生存期:和对象的生命周期是一样的,对象结束则它的生命周期结束。
修饰后的生存期:和程序的生命周期是一样的,程序结束则它的生命周期结束。
修饰前的使用范围:每个对象独享
修饰后的使用范围:所有对象共享
修饰前的初始化:初始化列表或者构造函数
修饰后的初始化:类内声明,类外定义初始化。当为静态常量时,整型可以类内初始化,其他类型也需要类外初始化。
如上所示:类的成员变量被static修饰后存储位置、生命期和使用范围都发生了变化。因为静态成员变量是由所有对象共享的,也就是不属于某个对象。因此静态成员变量需要存储在静态区,也必须要在类外定义。如果在类内定义,则所有的对象都会包含该静态成员,和不属于某个对象相矛盾。通过了解到静态成员变量是由所有对象共享的这个关键点,其他的疑问也就迎刃而解了。

2、修饰类的成员函数

当用stati关键词修饰类的成员函数后,我们先观察一下类的成员函数的使用范围有什么变化:
修饰前的使用范围:每个对象独享
修饰后的使用范围:所有对象共享
修饰前有无this指针:有
修饰后有无this指针:无
因为静态成员函数是所有对象共享的,所以静态成员函数没有this指针。因此,静态成员函数与普通成员函数的根本区别在于:普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值