C++学习6:static关键字

推荐阅读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成员变量。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值