您的位置:首页 > 编程语言 > C语言/C++

c/c++的static的作用和特点总结

2015-02-28 17:51 148 查看
c/c++的static的作用和特点:

(1)变量可见范围的控制:

加static前缀的全局变量和函数只在本源文件有全局性, 在其他源文件中则是不可见的.

eg: sub.c 文件中有个 static int num 的静态全局变量. 则在main.c文件中无法使用该变量.

注意:必须是sub.c ,不能是sub.h.

sub.c:

static int num=100;
int id=888;


main.c:

#include <iostream>
using namespace std;
extern int id;	//必须加extern, 不然id是随机数
//extern int num;  会报错
int main()
{
cout<<id;
}


运行结果: 888

(2)静态属性具有持久性:

其实全局变量本身就是静态存储的! 全局变量不会因为子函数结束而销毁, 包括加了static的全局变量.

普通局部变量的话, 函数结束自动销毁. 而加了static的局部变量就有静态属性了, 也即函数结束不会销毁, 但

是依旧是局部变量, 只对本函数可见.

(3)初始化只执行一次, 默认为0:

静态变量只能初始化一次; 若程序员没有在初始化时设定具体数值时,
系统默认初始化为0. 如static int b; 其

实这一句已经对b进行初始化了, b=0; 具体看下面的例子!

(PS:普通的全局变量有静态属性,因此系统也会默认将其初始化)

eg:

#include <iostream>
using namespace std;
int fun1()
{
static int a=5; //这句是初始化,只执行一次
return a--;     //这句不是初始化,而是赋值,执行次数无限制
}
int fun2()
{
static int b;   //这句是初始化,没手动初始数值则系统会自动初始化为0.只执行一次
b=9;            //这句是赋值,执行次数无限制
return b--;
}
int main()
{
for(int i=0;i<5;i++)
cout<<fun1();
for(int i=0;i<5;i++)
cout<<fun2();
//cout<<a;   这句是错的,局部变量加了static依旧是局部变量,但有持久性
//           也就是说,执行完函数后,静态变量的内存不会被释放掉!
}


运行结果: 5432199999

/************************************************************************************/

补充个人理解:

(1)

c++的class里面的static变量, 一般看到第一反应就是: 全局变量.

class里面的普通成员只有在创造出对象的时候才会分配内存.

但static的变量则在class建立的时候就分配了静态内存, 而且这个变量在函数外面, 故拥有全局性, 而且能独立于对象而存在.

类的static例子:

#include <iostream>
using namespace std;

class B{public:
static int gg;  //非const变量不能在class里面初始化, 必须在类外初始化!
};
int B::gg;	 //在类外初始化, 而Java则是在类内直接初始化.

int main()
{
cout<<B::gg;
}


运行结果: 0

(2)

关于static函数普通函数的区别?(转)

   static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数

(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该

在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.

  static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: