C++进阶(三)static 关键字

在作用域上,限定其作用范围

  对于全局变量和函数来说,使用 static 修饰,使得其仅在当前文件中可见,在其他的文件中不可见。

// static.c
static int g_c_staVal;
int g_c_Val;



// use_static.c
#include <iostream>
using namespace std;

extern int g_c_val;

int main(){
	// cout << g_c_staVal << endl;		// 编译失败
    cout << g_c_val << endl;
    func();
    return 0;
}

  在其他文件定义的静态变量,对其他文件不可见,所以编译失败。在其他文件定义的非static 变量,可以使用extern 声明,可以在文件中使用。

在内存方面,存储在静态存储区

  静态变量存储在静态存储区(全局变量区),全局变量区会被初始化为0。

#include <iostream>
using namespace std;

 void func(){
     static int i = 10;		// 在第一次执行时初始化
     i--;
 }
 
int main(){
    func();
    return 0;
}

  对于局部静态变量i ,会在第一次执行时初始化,在下一次执行func 函数时,不会初始化静态变量i,因为i 在全局变量区,但是i 的作用域仍是 func 内部局部变量的作用域。

类中的静态成员函数和成员变量

  1. 对于静态成员函数和静态成员变量,其属于类的属性,直接通过类进行调用
  2. 必须在使用前进行初始化,初始化时不需带 static 关键字,如int ClassName::staticVar = 10

  

static const 使用

  static const 修饰的变量与 const 修饰的相比,前者只能在当前的文件范围中使用,而后者可以再其他文件中使用。具体来说,有两种用法:

用法一:预编译声明

在类中定义 static const 变量并初始化变量,不可取值

class Test{
	const static int var = 1;

	// ...
};

  该用法作为预编译声明使用,相当于C的 #define ,但是需要编译器进行类型检查,保证程序的健壮性,此时只能用于基本数据类型。const存在于动态区(stack、heap),static存在于静态区(全局区),static const 声明的变量存在于常量区,在编译时,编译器会将该变量直接替换。

用法二:类的静态常量

  在类中声明 static const 变量,在类外定义static const 变量。在程序运行时加载至内存的常量区,所以可以进行取地址操作,但无法修改变量的值。

class Test{
public:
	const static int val;
	// ...
};

const int Test::val = 1;

  

巨人的肩膀

  1. static 关键字作用总结
  2. C++中static、const、static const修饰变量作用详解
  3. const 与 static const 不同
  4. C++ 常量区 栈区 堆区
  5. C++局部变量、全局变量、静态变量(堆、栈、静态存储区)

一键三连是对我的鼓励与支持!欢迎关注编程小镇,每天涨一点新姿势😄。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值