类的静态成员定义
静态成员是指用static定义的变量 就是成员变量前面加了个 static
静态变量分为全局变量和局部变量两种
静态全局变量
静态全局变量声明在程序所有函数之外,其作用域与全局变量一样,所有函数体都可以使用,但是静态全局变量只能严格限定在定义它的文件中,不能被其他文件使用(其他文件即使用extern声明过也不能使用)
拓展:extern:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
比如:在.h文件中我们只是定义,真正的函数内容我们是在.c文件中写的,extern声明也是一样,我们在.h文件中声明一个 extern int i;在相应.c文件中写 int i;这样这个变量 i 就能被其他函数调用了。
静态局部变量
静态局部变量声明在某个函数体中,其他函数不能使用。
静态局部变量的特殊之处在于,函数被调用N次,初始化语句只会执行一次,之后则会取在内存静态区中储存的上次函数调用结束时该静态变量的值,而不是初始化语句。
//特殊之处的举例说明#include<iostream>
using namespace std;
void Static()
{static int n = 1;n *= 2;cout<<"静态变量:"<<n<<endl;
}
void Auto()
{int n = 1;n *= 2;cout<<"普通变量:"<<n<<endl;
}
int main()
{Static();Static();Static();Static();Auto();Auto();Auto();Auto();return 0;
}
因静态局部变量的特殊之处,我们可以记录函数的调用次数
类的静态成员
会一直存在于程序的整个生命周期中,不会像普通变量一样随着对象的存在而存在,消亡而消亡
静态成员变量的声明
静态成员变量的声明方法:
static 数据类型 成员变量名;
静态成员变量属于类,该类的所有对象共享静态成员变量
#include<iostream>
using namespace std;
class Data
{public:int n;static int m; //静态成员变量 类内声明
};
int Data::m=0; //类外初始化
int main()
{Data d1,d2;return 0;
}//d1.n 与 d2.n 是两个不同的变量//d1.m 与 d2.m 是同一个变量
静态成员变量的初始化
类的static变量必须在类内声明,类外初始化
静态成员变量的初始化语句为:
数据类型 类名::静态成员变量 = 初始值;#include<iostream>
using namespace std;
class Data
{public:int n;static int m; //静态成员变量 类内声明
};int Data::m=0; //类外初始化int main()
{Data d1,d2;return 0;
}
静态成员函数
静态成员函数的声明
声明方法:
static 返回值类型函数名(参数表)//在书写静态成员函数的代码时,不必写static
#include<iostream>
using namespace std;
class Student
{int id;float score;static float sum; //总分 static int count; //计数public:Student(int i,int s):id(i),score(s) //定义构造函数{count++;} void total(); //总分 static float average(); //平均数 //静态成员函数的声明
};float Student::sum = 0; //静态成员变量的初始化
int Student::count = 0; void Student::total()
{sum += score;
}float Student::average() //静态成员函数
{if(count)return sum/count;
}int main()
{Student stu[3] = {Student(1,10) , Student(2,20) , Student(3,30)};for(int i=0;i<3;i++)stu[i].total();cout<<"平均分是:"<<Student::average(); //不需要用对象,因为这是共有的return 0;
}
说明:静态成员函数可以直接引用私有的静态数据成员(不需要加类名或者对象名)
建议:只用静态成员函数引用静态数据成员,而不引用非静态数据成员。这会使思路清晰,不易出错
对比
静态成员函数 | 普通成员函数 | |
---|---|---|
所有对象共享 | √ | √ |
this指针 | × | √ |
访问普通成员 变量/函数 | × | √ |
访问静态成员 变量/函数 | √ | √ |
通过类名调用 | √ | × |
通过对象名调用 | √ | √ |