<pre name="code" class="cpp">
#include<iostream>
#include<string>
using namespace std;
// int n;
//***************************************类中的静态成员变量*******************************************************
class Stu{
public:
int id;
string name;
static int num; //由于不属于任何一个对象而是属于整个类,所以在没有构造对象之前就可以对它进行访问,访问时
//访问格式见 line35
//遵循访问规则(public,private,protected)
//******************************************静态成员函数**********************************************************
static int getNum(){ //没有this指针
return num;
} //只能访问静态成员变量
//在此修改,在没有参数表的情况下才是只能访问静态变量,如果有参数表,可以访问参数对象的私有,保护,公有变量
//不能定义为虚函数(个人理解:本质并不属于某个对象,无所谓继承和多态性)
//访问格式见 line33
};
int Stu::num =0;//静态成员不储存在类中,初始化时要分配内存,所以在类外声明
//区别于定义的全局变量,要加Stu::命名空间
//在类外声明静态函数时要省略static,和静态变量的声明类似
void f(int & a){
a+=1;
}
int main(){
///cout<<n<<endl;
//n=3;
//****************************************************静态变量**********************************************************
//********静态成员变量和函数的访问规则
cout<<Stu::getNum()<<endl;
cout<<Stu::num<<endl;
Stu a;
cout<<a.num<<endl;
cout<<a.getNum()<<endl;
for(int i=0;i<10;i++){
static int n = 0; //在程序块中声明只会被初始化一次
//该变量的值会一直保存,直到下一次该函数再次被调用
//该函数结束的时候,n的内存不会被释放,而是在整个程序结束的时候被释放
//该变量不能在函数之外被访问
//ps:以上说的函数是指一个程序块{}
//优势在于如果是在f()内定义的话,变量的值保存到下次被调用
cout<<n<<endl;
n++;
}
//cout<<" "<<n<<endl;
// f(n); //静态全局变量不能被别的文件调用,但是可以被函数赋值修改
//而extern int n定义之后如果在别的文件中声明extern int 的话可以调用
//cout<<" "<<n<<endl;
//*******************************************************静态函数*******************************************************
// 只能在本文件中使用,其他文件中定义相同的名字不会有重名的冲突
return 0;
}
//***********************
//小结
// 1) 静态变量 和 静态成员变量 可以统一理解,
// 把类看作一个函数
// 或者把函数看作一个拥有命名空间的类
// 2) 静态函数用的不多,静态成员函数访问规则和理解也都见注释
//