C/C++经验之static关键字

版权声明:本文为博主原创文章,转载时请标明来源。 https://blog.csdn.net/aiwangtingyun/article/details/86562458

在C/C++编程中经常使用static关键字来设计程序,static使用好的话可以解决很多问题,所以在面试的时候,一般都会考察大家对static的掌握程度如何。下面我来总结一下static关键字的使用方法:

一、修饰局部变量改变生存周期(C/C++都适用)

首先,局部变量按存储方式分为三种类型:auto、static、register

auto:auto类型为局部变量默认类型,即变量面前不加修饰则默认为auto,这种变量是存储在栈中的,当变量走出代码块区域或函数结束时会被编译器自动释放,其中未初始化的auto变量值时未定义的。

static:static修饰的局部变量是存储在静态存储区中。相对于auto,static局部变量不会因为代码块或函数结束而被释放,其会一直存在于整个程序中,直到程序结束为止,而未初始化的static变量默认为0(只要是存放在静态存储区的变量都默认初始化为0)。

register:这种变量称为寄存器变量,使用的比较少,该关键字所修饰的变量是请求编译器把变量放入寄存器中以提高变量的读取速度,多用于会被频繁读取的变量,但这只是一种请求,编译器会根据情况(有可能寄存器被占满)来决定是否把该变量存入到寄存器中。但要注意的是在C中,不能对register所修饰的变量取地址,C++可以取地址,但一旦对其取地址意味着register关键字无效,同时在C++中如果某个变量被连续多次使用的话,编译器会优先把它放到寄存器中,比如:for (int i = 0; i < N; i++) 中的i变量。

所以从上面的介绍可以看出使用static关键字修饰局部变量可以延长该变量的生存周期,同时可以使其默认值为0。

二、修饰全局变量或函数(非类成员函数)改变作用域(C/C++都适用)

首先,我们需要明白的是,不管全局变量前面是否添加了static关键字修饰,其都是存储在静态存储区的,生存周期为整个程序运行期。而添加static关键字可以把变量或函数的作用域限制在本文件内,相当于隐藏在本文件内,专业术语叫"internal linage"内部链接,相对于"extern linage"外部链接,这样在多人团队编写代码时可以避免自己编写的变量和函数与其它文件文件中的相同而发生冲突。

ps:(对于那些把数据定义在头文件的代码来说,如果不使用static关键字修饰的话,在多文件包含的情况下必定会出现重定义现象)

三、修饰类成员变量或函数改变变量或函数的归属性(C++特有)

当使用static修饰类的变量或函数时,表明该变量属于该类而不是属于该类的某个对象。也就是说,static修饰的成员变量和函数不需要实例化该类的对象就可以访问:

class myClass 
{
public:
	static int getCount();	// 静态成员函数声明
public:
	static int count;		// 静态成员变量声明
};

int myClass::count = 1;		// 静态成员变量定义(不要加static)

int myClass::getCount()		// 静态成员函数定义(不要加static)
{
	return count; 
}

所以我们可以直接使用类作用域符访问静态成员:

int localCount = myClass::count;
int localCount = myClass::getCount;

ps
①static成员变量的声明周期和普通静态变量一样,都是在程序运行时进行内存分配和初始化,直到程序结束时才被释放,所以不能在类的构造函数中进行初始化静态成员变量。
②static成员函数没有this指针,只能访问静态成员变量或其它静态成员函数而不能访问非静态成员变量和非静态成员函数,如果要访问非静态成员,需要传入this指针,但非静态成员函数即可以非静态成员函数也可以访问静态成员函数。

猜你喜欢

转载自blog.csdn.net/aiwangtingyun/article/details/86562458
今日推荐