C++入门——static(静态)变量

C语言中,static(静态)变量的作用

  1. 在函数体内,静态变量具有“记忆”功能,即一个被声明为静态的变量只会被初始化一次,然后在这一函数被调用的过程中其值维持不变

  2. 在文件内(但在函数体外),用来限制变量或函数的作用域为当前文件,即如果一个变量被声明为静态的,那么该变量可以被当前文件内所有函数访问,但不能被其他文件中的函数访问。它是一个本地的全局变量,且只会被初始化一次。

  3. 如果一个函数被声明为静态的,那么该函数与普通函数作用域不同,其作用域仅在本文件中,它只可被当前文件内的其他函数调用,不能被其他文件的函数调用。也就是说,这个函数被限制在仅能被声明它的文件内使用。

C++中,static(静态)变量的作用

对于C++,除了C语言中的功能外,在类内的数据成员也可以被定义为static,在这种情况下,该数据成员就是类的静态数据成员,静态数据成员有以下特点:

  1. 对于非静态数据成员,每个对象都有自己单独的一个副本。而静态数据成员被当作是类的成员,只会存在唯一的副本,且被所有对象共享。

  2. 静态成员变量属于类而不属于对象。也就是说,即使没有实例化的对象,也可以使用静态变量,通常通过“类名::静态成员变量”来访问。

  3. 静态数据成员和普通数据成员一样遵从public、protected、private访问规则

  4. static成员变量的初始化是在类外,初始化的时候不需要再使用static关键字。被private或protected修饰的static成员虽然可以在类外初始化,但是不能在类外被访问。

  5. 在类中,被static修饰的函数是类的静态成员函数,静态成员函数也属于类,而不属于某一个特定对象,被所有对象共享。因此,它没有this指针。从这个意义上讲,类的静态成员函数无法访问对象成员,也无法访问普通成员函数,它只能访问静态成员函数或静态成员变量。

静态数据成员的优势

与全局变量相比,使用静态数据成员有以下两个优势:

  1. 全局变量的作用范围是整个工程,而static变量的作用范围仅仅是这个变量所在的文件。static变量与全局变量相比,减少了命名冲突的可能性。可以在不同文件中定义名称相同的static变量,但是不能定义名字相同的全局变量。

  2. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能。

注意事项

类的静态成员必须初始化,而且必须在类外初始化。类中的静态成员变量仅仅是声明,而变量被声明的时候不分配内存空间,只有在定义的时候才分配空间,变量的声明可以理解为一个承诺,它承诺这个变量将会在某个地方被定义。

由于类的声明可能会被多个地方引用,如果把静态变量的初始化放在类内,每次引用都会初始化一次(分配一次空间),这与静态变量只能初始化一次且只存在一个副本相冲突,因此静态变量只能在类外初始化。

为什么static变量只初始化一次

对于所有对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有记忆功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会在此初始化。

存放在静态区的变量的生命周期一般都比较长,在程序结束后被释放,所以它只需初始化一次。而auto变量,即自动变量,由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。

是否可以在头文件中定义静态变量

不可行,如果在头文件中定义静态变量,会造成资源浪费,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,在每个头文件中都会单独存在一个静态变量,从而引起空间浪费或程序错误。

所以,不推荐在头文件中定义任何变量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值