C++学习6:static关键字

来源:互联网 发布:淘宝真丝客服沟通技巧 编辑:程序博客网 时间:2024/06/14 08:47

推荐阅读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指针,这也是它不能访问类对象的非静态成员的原因。

原创粉丝点击