之前没注意static这个关键词,被人问到的时候竟然不知道= =!果断补补
1.全局变量与静态全局变量,全局变量可以在声明的情况下,在项目的各个文件通用,静态全局变量就只能在当前定义的文件下使用。
//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