打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C/C++中static解析

from http://blog.csdn.net/kingstar158/article/details/6880834

在C/C++中,static有两种含义:

 1. 在固定的地址上进行存储分配,即对象在一个特殊的静态数据区(static data area)上创建 ------  静态存储

 2. 对于一个特定的编译单元是局部的 ------  C++局限于类

 针对第一个点,最先想到的就是变量,由编译器在静态数据区为其分配内存空间;static负责创建的变量称之为静态变量,例如:函数内部的静态变量,类的静态数据成员和静态函数等。

    函数内部的静态变量:只在函数的第一次调用时进行初始化,之后的函数调用中将保留静态变量的值。

    类的静态数据成员:编译器在静态数据区创建,属于类,所以对象共享静态数据成员的存储区。

    类得静态成员函数:和静态数据成员函数相似,属于类所以,对象共有,但不能调用普通的成员函数和成员变量;

 下面详细对static的几点用法做说明:

1.函数内部的静态变量

         函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;

例如:你想知道一个函数被调用了多少次,静态变量可以轻松的解决这个问题;函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;

  1. #include <stdio.h>  
  2.   
  3. int fun()  
  4. {  
  5.     static int count = 0;  
  6.     count++;  
  7.     return count;  
  8. }  
  9.   
  10. int main()  
  11. {  
  12.     int sumCount;  
  13.     int index;  
  14.     for (index=0; index<10; index++)  
  15.     {  
  16.         sumCount = fun();  
  17.     }  
  18.     printf("%d\n",sumCount);  
  19.     system("pause");  
  20.     return 0;  
  21. }  
  22.   
  23.   
  24. //结果: 10  

由上面的代码可以看出,函数内部的静态变量只在函数的第一次调用时初始化,之后在调用fun()函数,count中保留着上次调用的值,并非又重新初始化为0;在后面的调用中将已现保留的值进行计算.

2.函数内部的静态对象

   对象,更多的是牵扯到用户自定义的数据类型,而对于用户自定义的数据类型必须用构造函数来初始化,所以在定义一个静态对象时没有指定构造函数参数,这个类必须有默认的构造函数。

   静态函数的析构函数在程序main()中退出时,活着C标准库exit()函数被调用时才被调用,多数情况下main()函数的结束也是调用exit()函数结束程序的,所以在析构函数内部使用exit()是很危险的,很容易造成无穷的递归调用,但是在使用标准的C库函数abort()来退出程序,静态对象的析构函数是不会被调用的。

 

3.类中的静态数据成员

  类的静态数据成员拥有一块单独的存储区,它是属于类。不管创造多少个对象,这些对象共享静态数据成员的存储区域,而且它的名字在类的作用域范围内有效;同时也应该注意的是静态数据成员的定义(初始化)必须出现的类的外部(不允许内联);

  1. class A  
  2. {     
  3.     statci int i;  
  4. public:  
  5.    //...  
  6. }  
  7.   
  8. int A::i = 0;  
  9.    

这样的定义,我们会想到int i 是私有成员,而在类的外部进行定义,破会了类得安全性,但是在C++中有两点保证了它是绝对安全的:

     a. 这些变量的初始化唯一合法的地方在定义时。

     b. 一旦这些数据被定义了,最终的用户就不能在定义它。

4.静态成员函数

    静态成员函数和静态数据成员有着一样的特性,属于类共有;类得静态成员函数不能访问一般的数据成员,只能访问静态数据成员,也只能调用静态成员函数;这是因为在静态成员函数中没有this 指针。

    通常类中成员函数调用时,对象的地址(this)是被隐式的传递到被调用的函数的,由于静态成员存储在特殊位置,并且没有对象的地址的传递,所以是不能够调用一般的数据成员和成员函数的

  1. class X  
  2. {  
  3.     int i;  
  4.     static int j;  
  5. public:  
  6.     X(int ii):i(ii)  
  7.     {  
  8.        j = i;  
  9.   
  10.     }   
  11.     int val() const { return i;}  
  12.     static int incr()  
  13.     {  
  14.        //i++;            //error   
  15.        return j++;  
  16.     }  
  17.     static int f()  
  18.     {  
  19.        //val();           //error  
  20.        return incr();  
  21.     }  
  22. };  

新手,了解的不够深,以后有更深层次的了解之后会追加的!作为学习过程中的一种总结吧...

  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++中static用法详解
Static成员变量,static成员函数解析
cpp关于const和函数
解析出c++中的内部链接与外部链接_学习笔记
c# static的全部用法
50道c++面试题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服