推荐阅读http://blog.csdn.net/hackbuteer1/article/details/7487694
这里使用的示例是该博客中的。
c++中的static用于定义静态变量、函数以及类中的静态成员,特点是在程序开始时分配空间,结束时释放空间,默认初始化为0。
简单概括static的作用有两种:
1.改变存储空间位置,实现数据共享。
2.限定作用域,可以防止不同文件中函数重名。
1.静态局部变量
功能:
静态局部变量可以减少函数间的传参,而且作用域只在函数内,不对函数外造成影响,便于管理。
对于一个完整的程序,其内存分布情况如下图:
当定义一个局部变量时,会存储在栈中。使用static能够改变存储方式,在变量前增加static,该变量的存储空间将变为静态存储区,即数据段或BSS段,存储在该区域的数据只有在程序结束时才被释放,不会因函数退出释放空间。
来看一个具体的例子:
#include<iostream>
using namespace std;
void fn();
int main(void)
{
fn();
fn();
fn();
system("pause");
return 0;
}
void fn()
{
static int n = 10;
cout<<n<<endl;
n++;
}
运行结果如图:
在函数fn中定义了一个静态局部变量n,其存储在数据段中,只在第一次调用时进行初始化,之后再次调用时不再重复初始化。可以看到,静态局部变量起到了全局变量的作用,n的值可以一直保持。
静态局部变量的性质:
相对于局部变量,其区别在于存储在数据段中,不随函数结束被释放,能够保持到程序结束,而且未初始化的静态局部变量会自动初始化为0。
相对于全局变量,其区别在于作用域只在函数中,不会对函数外造成影响。
2.静态全局变量
功能:
将全局变量作用域只限定在本文件内,可以防止不同文件间的重名冲突。
在全局变量前增加关键字static,就成为了一个静态全局变量,示例如下:
#include<iostream>
using namespace std;
static int n; //定义静态全局变量
void fn()
{
n++;
cout<<n<<endl;
}
int main(void)
{
n = 20;
cout<<n<<endl;
fn();
return 0;
}
运行结果和全局变量是相同的,其与全局变量的区别在于:
1.未初始化的静态全局变量自动初始化为0。
2.静态全局变量不能被其他文件调用,使用extern声明也无法对其进行调用。因此在其他文件中可以定义相同名字的变量。
3.静态函数
功能:
将函数的作用域限定在本文件中。
在函数的返回类型前增加static关键字,就成了一个静态函数,示例如下:
#include<iostream>
using namespace std;
static void fn(); //声明静态函数
int main(void)
{
fn();
return 0;
}
void fn() //定义静态函数
{
int n = 10;
cout<<n<<endl;
}
其与普通函数的区别在于:
静态函数不能被其他文件调用,因此在其他文件中可以定义相同名字的函数。
4.类中的静态成员
功能:
静态成员变量可以实现不同类对象间成员变量的共享。静态成员函数针对类成员,不需要针对特定对象。
static可以在类中的使用,定义静态成员变量和静态成员函数,可以对应静态变量和静态函数来理解。静态成员之间可以相互访问,但是不能访问非静态成员。而非静态成员可以访问静态成员。
静态成员变量,示例如下,静态成员变量遵循public,protected,private访问规则,可以是private成员,而全局变量是不可以的。
#include<iostream>
using namespace std;
class Myclass
{
private:
static int a; //声明静态数据成员
};
和静态局部变量和静态全局变量一样,静态成员变量的存储空间发生了改变,一次定义初始化后会始终保持,直到程序结束。因此不管该类对象被定义了多少个,只分配一次空间,也就是说该静态成员变量为所有对象共用。
静态成员函数,示例如下:
#include<iostream>
using namespace std;
class Myclass
{
private:
static int sum; //声明静态数据成员
public:
static void GetSum(); //声明静态成员函数
};
void Myclass::GetSum() //静态成员函数的实现
{
cout<<"sum="<<sum<<endl;
}
需要注意:静态成员函数的定义只能在类中,类外的定义不能指定static关键字。而且静态成员函数不具有this指针,这也是它不能访问类对象的非静态成员的原因。
4.总结static作用
牛客C/C++常考面试题总结的很不错,这里直接贴过来了。
static关键字至少有下列n个作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。