总结介绍C++标准中 Static 的用法.Code & Algorithm.

Static关键字的作用主要是:设定作用域?

 

C++的static有两种用法:

面向过程程序设计中的static 和 面向对象程序设计中的static。

前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

1.静态全局变量

全局变量前面添加static关键字…

看下面的代码段:

main.cpp

static.cpp

程序运行会报错,只有去掉两个文件内的static才可以使用。

所以可以知道,静态全局变量有如下特点:

  1. 该变量在全局数据区分配内存.
  2. 自动初始化为0.
  3. 在当前文件内全局可见,其他文件内不可见.
  4. 其他文件中可以定义相同名字变量,不冲突.(去掉main函数内的extern运行即可看到)
  5. 全局变量定义两个会重定义.去掉static 和 extern 运行即可.

等等还有,很多情况,可以自己慢慢尝试体会。

 

2.局部静态变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

其实看起来,局部静态变量,就像一个局部可以使用的全局变量(因为它只会初始化一次)…

局部静态变量有以下特点:

  1. 全局数据区分配内存
  2. 初次定义时初始化,以后不再初始化
  3. 如果没有显示初始化,则自动初始化为0
  4. 会一直存在于全局数据区,直到程序运行结束。但是其作用域为局部作用域。

 

3.静态函数

所谓静态函数,就是在函数的定义前面加上static关键字.

静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

main.cpp

static.cpp

去掉static.cpp内function函数的static即可运行

 

3.类的静态成员变量

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。

运行结果可以发现,无论是用A还是B去调用,sum的值就像是他们共享的一样。

这就是静态数据成员特点:

  1. 静态数据成员的值对每个对象都是一样的,它的值可以更新。
  2. 静态数据成员存储在全局数据区
  3. 因为静态数据成员定义时要分配空间,所以不能在类声明中定义
  4. 静态数据成员和普通数据成员一样遵从public, protected, private访问规则
  5. 即使没有类的实例,也可以操作它。<类 类型名>::<静态数据成员名>
  6. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
  7. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

 

4.静态成员函数

与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。

普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。

但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数

下面举个静态成员函数的例子。main.cpp

所以我们可以总结静态成员函数:

  1. 实现的时候,出现在类体外的函数定义不能指定关键字static;
  2. 静态成员函数可以访问静态成员函数和静态成员变量。
  3. 静态成员函数不能访问非静态的成员函数和非静态的成员变量
  4. 由于没有this指针的开销,静态成员函数的全局速度比类的全局函数速度快一些
  5. 类直接调用方法:<类名>::<静态成员函数名>(<参数表>)

大致就是以上四条… 今天阿里二面提到了…总结了出来。

【C++】Static用法详解
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
最新
最旧 最多投票
内联反馈
查看所有评论