C++ Static

前言

今天看到static关键字,对其朦朦胧胧的,所以专门查找了一下相关的定义和说明来深入理解
参考文章 : C/C++中STATIC用法总结

使用Static的作用主要有两种:

  1. 第一个作用是限定作用域
  2. 第二个作用是保持变量内容持久化

c中static的用法:

1. 全局静态变量

用法: 在全局变量前加上关键字static,全局变量就定义成一个全局的静态变量。
内存中的位置:静态存储区,整个程序运行过程中一直存在
作用域:全局静态变量在声明它的文件之外是不可见的,也就是说作用在声明所在的文件中

2. 局部静态变量

在局部变量之前加上关键字static,局部变量就成为一个局部静态变量
内存中的位置:静态存储区
初始化:未经过初始化的全局静态局部变量会自动初始化为0
作用域:作用域仍然为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。当局部静态变量离开作用域之后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能对它进行访问,之道函数再次调用的时候,值依然保持不变。

C++中static的用法

类的静态成员

class A
{
private:
    static int value;
}

在Cpp中必须对静态变量进行初始化,

初始化时,使用作用域运算符来标明其所属的类,其属于所有成员共有,只有一个拷贝。

类的静态函数

class A
{
private:
    static int func(int x);
}

实现的时候也不需要static的修饰,因为static是声明性关键字;
类的静态函数是该类的范畴内的全局函数,不能访问类的私有成员,只能访问类的静态成员,不需要类的实例即可调用;
实际上,他就是增加了类的访问权限的全局函数;

void  A::func(int);

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

只在cpp内有效的全局变量:

在cpp文件的全局范围内声明:

static int val = 0;

这个变量的含义是该cpp内有效,但是其他的cpp文件不能访问这个变量;如果有两个cpp文件声明了同名的全局静态变量,那么他们实际上是独立的两个变量;

只在cpp内有效的全局函数:

函数的实现使用static修饰,那么这个函数只可在本cpp内使用,不会同其他cpp中的同名函数引起冲突;

warning:不要再头文件中声明static的全局函数,不要在cpp内声明非static的全局函数,如果你要在多个cpp中复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰;

智能指针下的static

这里使用GetMyType()的操作,通过Static的方式来获取智能指针

测试发现,使用静态变量后,Get的操作都是相同的内容,而且Type只创建了一次。

由于类中使用了静态变量,所以类只有程序退出的时候才会完全析构。





posted @ 2018-06-05 17:52  小黑的守望  阅读(1018)  评论(0编辑  收藏  举报