雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

static

Posted on 2013-12-28 16:51  huhuuu  阅读(322)  评论(0编辑  收藏  举报

  之前没注意static这个关键词,被人问到的时候竟然不知道= =!果断补补

  1.全局变量与静态全局变量,全局变量可以在声明的情况下,在项目的各个文件通用,静态全局变量就只能在当前定义的文件下使用。

  1)全局变量是不显式用static修饰的全局变量,但全局变量默认是动态的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
  2)全局静态变量是显式用static修饰的全局变量作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
//Example 2
//File1 第一个代码文件的代码
#include <iostream>
using namespace std;
void fn();    //声明 fn 函数
static int n; //定义静态全局变量
void main(){    
    n=20;    
    cout<<n<<endl;    
    fn();
}
//File2 第二个代码文件的代码
#include <iostream>
using namespace std;
extern int n;
void fn(){    
    n++;    
    cout<<n<<endl;
}

  2.静态局部变量与局部变量

  静态局部变量在全局数据区中,而局部变量在内存栈中,所以函数结束,局部变量被释放,而静态不被释放,依旧保留上一次的结果。

  

  3.全局函数与静态全局函数

  作用域的不同,跟全局变量与静态全局变量的作用局机制类似。

 

  4.非静态数据成员与静态数据成员

  对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;

  5.成员函数与静态成员函数

  与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部 实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this 是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指 针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。

  优点:由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;

  缺点:静态成员函数只能访问静态数据成员

#include<stdio.h>
#include <iostream>
using namespace std;

class Myclass{
public: Myclass(int a,int b,int c);
        static void GetSum(); 
        // 声明静态成员函数
private: int a,b,c;
         static int Sum;
         //声明静态数据成员
};
int Myclass::Sum=0;
//定义并初始化静态数据成员

Myclass::Myclass(int a,int b,int c)
{
    this->a=a; this->b=b; this->c=c;
    Sum+=a+b+c;
    //非静态成员函数可以访问静态数据成员
}

void Myclass::GetSum() //静态成员函数的实现
{
    // cout<<a<<endl; //错误代码,a是非静态数据成员 
    cout<<"Sum="<<Sum<<endl;
}

class data{
    int a;
    inline ~data(){
    }
};

void main(){
    Myclass M(1,2,3);
    M.GetSum(); 
    Myclass::GetSum();
    Myclass N(4,5,6);
    N.GetSum();
    Myclass::GetSum();

    getchar();
}

参考:http://baike.baidu.com/link?url=37eC8nXdPrs4p6SJYvK52TfCTaQ5aIOWTioQ-HCeBrXWhLbDLR9W7srYtv1OKFdK