浅析C++中的static和extern

static与extern都是限定符:限定当前变量的适用范围。其中static的情况有很多种,有的时候不仅仅是限定符的作用。
在全局变量中:static限定变量只能在当前文件中使用,其它的文件是不能访问该变量的;而extern 声明的变量是可以在其它文件中访问的,这个时候就要注意,变量的重复定义,导致程序运行不成功。
一个全局变量默认为extern:即其他文件中也可以使用,见例子
在这里插入图片描述
在这里插入图片描述
我们在test.cpp中声明了一个变量j,这个时候j默认为extern类型的,即在main.cpp文件中也可以使用,其中main.cpp文件中的第5行是告诉我们,已有其它文件定义了变量j,如果这个时候我们还加上第7行定义,就会出现重复定义的问题。而此时test.cpp中定义的i变量则只能在test.cpp文件中使用,而main.cpp是不知道。

一般来说因为全局变量默认是extern类型,所以我们在定义extern类型变量的同时是不会写extern,extern会出现在声明语句里面。再就是extern类型的全局变量一定要有明显的初始化(extern int i = 0; int i =0),而static可以有不明显的初始(static int j,这里会给j默认赋值为0),即赋给对应类型的默认值。
个人理解extern只会涉及到全局变量,而static还会设计到局部变量和类成员变量和成员函数。

下面将记录个人对static的全部理解:
关于全局变量,这里就不在讲述。
1.静态局部变量:静态局部变量的周期,是从它建立开始,一直到主函数main的结束。这个与一般的局部变量周期不一样。即静态局部变量在创建过后,一直到程序结束这中间是不会消失的,里面所存储的值,也不会在每一次遇到定义语句就初始化一次,如下图。
在这里插入图片描述
我们使用静态局部变量来记录调用函数p的次数,当第一次调用p函数时,创建ii变量。而后每一次使用p函数都不会在创建ii变量,而是使用之前创建的变量ii的值,故而可以记录函数p的调用次数。而我们使用一般的局部变量,在第一次调用函数p的时候创建改局部变量,而在第一次函数调用结束时就销毁了该局部变量。到第二次调用的时候,就又需要重新创建该局部变量重新赋予初值,这样就达不到记录函数调用的目的。

2.类的静态成员变l量和静态成员函数:
静态成员变量:静态成员变量是属于类属性,只有一份大家共享,每一个类对象都可以使用并修改。只有静态常量的各种整型才可以在类里面声明属性的时候进行初始化,其它的都需要在类外进行初始化。
普通成员变量:普通成员变量(对象属性),即每一个类对象单独使用一份。
见图:
在这里插入图片描述
静态成员函数:非静态函数可以访问静态成员函数和静态成员变量,非静态的也可以,静态成员函数只能使用静态成员变量和其它静态成员函数,静态成员函数的访问和静态成员变量一样,建议使用(类名.函数名字)来访问而不建议使用对象名方式的访问(对象.静态函数名)。
3.静态对象:
静态对象因为在声明时就需要初始化,如果不给初始化值,那么就给改静态变量赋予默认的初始值,所以静态对象的类也必须需要有默认构造函数来初始类的成员变量,否则会报错,如图。
在这里插入图片描述
这里就是因为类Test1提供了有参构造而导致没有默认构造函数,故而报错。我们需要做一下修改就不会了:
在这里插入图片描述
再就是静态对象的生命周期和之前C++自定义的静态变量周期一样,从创建到main结束。多个静态对象,在主函数运行结束后,遵循先构造的最后析构的规则,销毁所有静态对象。

以上就是我目前对static和extern的认识。
本文仅作记录C++学习之路,若有不足之处望各路大神指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值