C++ static关键字的使用总结

概述

平时写代码时会用到类的静态函数,但是对于static整体认识并不明朗,今天就对static进行整理。

1、c中static的用法

static在c中的作用主要有两个:限定作用域、保持内容持久化。主要使用的地方有以下几种。

1.1、静态全局变量

语法:在全局变量前面加上关键字static,全局变量就定义成一个静态全局变量。如:static int globleValue;
初始化:未经初始化的静态全局变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)
作用域:静态全局变量在声明它的文件之外是不可见的,这样其它文件可以定义同名全局变量,编译时会对静态全局变量重新命名(尽量不要这样)
生命周期:整个程序运行期间
内存中位置:静态存储区

test.c

int globleValue = 10;			//未加static
static int globleValue2 = 20;	//添加static


main.c

#include .......

int main()
{
	extern int globleValue;		//说明是外部定义,这里只是使用
	extern int globleValue2;	
	cout << globleValue << endl;
}

globalValue的使用没有问题,但是globalValue2会在编译时报错

1.2、静态局部变量

语法:在局部前面加上关键字static,局部变量就定义成一个静态局部变量
初始化:未经初始化的静态局部变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)
作用域:作用域不变,在作用域之外不可使用但是在静态局部变量在离开作用域后,并没有销毁,而是仍然保存在内存中
生命周期:整个程序运行期间
内存中位置:静态存储区

test.c

int func(void)
{
	static int a = 10;	//这里对静态局部变量进行初始化
	return a;
}

1.3、两者的差别和使用规则

存储在静态存储区的变量会在程序刚开始运行时就完成了初始化,也是唯一的一次初始化。两者唯一的差别是可见范围不同:静态全局变量在整个文件有效,而静态局部变量只在该变量的作用域内有效

使用规则:

  1. 若全局变量仅在单个文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度。
  2. 若全局变量仅在单个函数中访问,则可以将这个变量改为静态局部变量。
  3. 全局变量、静态局部变量、静态全局变量都存放在静态数据存储区。
  4. 函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针(临时变量返回之后销毁了)。

2、C++中static的用法

因为C++扩展C,兼容C,所以上面C的用法对C++同样适用。下面说说C++扩展的用法。

2.1、类的静态成员

语法:在类型变量前面加上关键字static,如下:

class myclass
{
	static int val;
};

需要在cpp中对它进行初始化,初始化时使用作用域运算符来表明它所属类,其属于该类的所有成员公有,只要一份数据。

int myclass::val = 10;

注意:这里的防控属性还是有用的,只能在类函数中使用,不能直接在类外myclass::val这样使用

2.2、类的静态成员函数

语法:在函数返回值类型前面加关键字static,如下:

class myclass
{
public:
	static int func(int x);
};

实现时不需要添加static修饰,因为static是声明性关键字。静态成员函数属于整个类,而非类的对象,所以没有this指针的概念,所以不能访问类中的非静态成员变量

静态成员函数可以继承和覆盖,但无法是虚函数。

2.3、注意事项

  1. 类中的静态成员属于整个类,对类求sizeof不包含static成员
  2. 静态成员变量是静态存储的,所以必须对它进行初始化,初始化可不加访问限制符。
  3. 静态成员函数没有this指针,只能访问静态成员变量和静态成员函数
  4. 也由于没有this,少了额外开销,调用速度回快一些
  5. 虚函数不能使用static修饰
  6. 为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类影响,编译器会生成唯一标志,不会重名。

感谢大家,我是假装很努力的YoungYangD(小羊)。

参考资料:
https://www.cnblogs.com/jhmu0613/p/7131997.html

你可能感兴趣的:(C\C++)