C++中static关键字属性

C++ static关键字

不考虑类

1.隐藏

当我们编译多个文件的时候,所有未加static前缀的全局变量和函数都具有全局可见性。在其他文件中可以使用extern关键字在其它文件中使用到。
例如:
我在1.cpp/1.c中定义了一个int i变量。我们可以在main.c/main.cpp中使用extern找到我们在1.cpp中定义的i变量。

2.默认初始化为0
其中未初始化的全局静态变量和未初始化的全局静态变量都具有这个属性(他们都在内存区域的BSS段)
比如我们可以初始化一个稀疏矩阵,就不需要使用循环遍历初始化了。又或者想一个字符数组当做字符串使用,可以省去每次都在末尾添加‘\0’的操作了,只需要将它设置为static属性就可以了,因为里面全都是‘\0’。

3.static可以保持局部变量的持久性
函数内自动的局部变量只有调用时存在,退出函数后就消失,但是静态局部变量虽然在函数内定义的,但静态局部变量始终存在着,也就是说他生存期为整个源程序,特点就是只会进行一次初始化操作。
虽然静态局部变量生存期为整个源程序,但是其作用域和局部变量是相同的,即只能在定义改静态变量的函数体中使用。退出函数后虽然变量还存在,但是已经不能使用他了

  1. 可以利用static属性隐藏变量和函数名字
    C语言中可以通过是用static来隐藏模块内部的变量和函数声明, 就像C++中的private一样, 都是私有的 只可以被本模块进行使用.所以尽可能的使用static属性来保护变量和函数是一个很好的编程习惯
  2. 一个模块不同作用域的static变量的符号名字不同的
    比如在test函数下有一个x的静态变量 在test2下面也有一个x的静态变量
    这两个变量都在.data或者.bss中 但是他们的符号可能分别是x.1和x.2

类中static的作用

静态数据成员
在类内数据成员声明前加上关键字static就是该类的静态数据成员,不像其他的类内数据成员一样存在于每个对象之中。static数据成员独立于对象存在,每个static数据成员都是与类关联的对象,但不与该类的对象相关联,也就是说其中一个对象更改了一个静态数据成员,其他的类对象都能看得到。
静态数据成员一样遵从private protect public访问规则。
静态数据成员存储在全局(静态)存储区。静态数据成员定义时要分配内存空间,所以不能在类声明中定义,static数据成员必须在类定义体的外部定义(正好一次)。

在类定义体中初始化是错的 例如:

class A{
	static int i =1;//是错误的
}

我们可以在类外定义,例如:

int A::i =1;

这个规则有个例外就是基本整形const static数据成员可以在类的定义体中进行初始化。

静态成员函数
静态成员函数和静态数据成员一样,都是类的内部实现,属于类定义的一部分,他为类服务而不是为了类的某个具体对象服务。
因为普通的成员函数总是具体的属于某个类的具体对象,所以普通成员函数隐含了一个this指针,this指针指向类的对象本身。
但是和普通成员函数相比,静态成员函数由于不和任何的对象相关联,因此他不具有this指针,因而他无法访问类对象的非静态数据成员,也无法访问非静态数据成员函数,它只能调用其余的静态成员函数与访问静态数据变量。
因为static成员不是任何对象的组成部分,所以static成员函数不能被声明成为const。毕竟,将成员函数声明成const就是承诺不会改变该函数的所属对象,而static成员函数不属于任何对象
最后,static成员函数也不能被声明成为虚函数、volatile

总结:1)静态成员之间可以互相访问,包括静态成员函数,静态数据成员,但是静态成员函数不能访问非静态成员函数和非静态成员变量,相反,非静态成员函数可以随意访问任何静态成员函数和静态成员变量。
2)由于没有this指针的额外开销,因此静态成员函数要比类的非静态成员函数相比速度上有一些增长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值