目录
类的静态成员变量与静态成员函数
对类的静态成员变量直接操作
#include <iostream>
using namespace std;
class Cstudent
{
private:
int mark;
float height;
public:
static int master_num;
Cstudent(int Dmark, float Dheight) :mark(Dmark), height(Dheight){} // 不可用于初始化静态成员变量
};
int Cstudent::master_num = 0; // 必须在类外初始化类的静态成员变量,因为静态成员变量的地位与类等同,要高于普通的成员函数
int main()
{
Cstudent stud1(85, 189.35);
stud1.master_num = 1; // 也可以用对象调用
Cstudent::master_num = 2; // 由于同级,因此可用类名(作用于限定符)调用
}
用类的静态成员函数初始化静态成员变量
#include <iostream>
using namespace std;
class Cstudent
{
private:
int mark;
float height;
static int master_num;
public:
Cstudent(int Dmark, float Dheight) :mark(Dmark), height(Dheight){} // 不可用于初始化静态成员变量
static void init(int master); // 由于级别不同,因此在静态成员函数中不可以使用类的成员变量
static void out();
};
int Cstudent::master_num = 0; // 必须在类外初始化类的静态成员变量,因为静态成员变量的地位与类等同,要高于普通的成员函数
void Cstudent::init(int master) // 类静态变量的专属操作函数——静态成员函数
{
master_num = master;
}
void Cstudent::out()
{
cout << master_num << endl;
}
int main()
{
Cstudent stud1(85, 189.35);
stud1.init(1); // 也可以用对象调用
Cstudent::init(2); // 由于同级,因此可用类名(作用于限定符)调用
Cstudent::out(); // 用作用域类名调用静态成员函数更凸显出静态成员与类的等同地位
}
静态成员为什么声明必须在类内,定义必须在类外?
静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。
变量的声明并不会为其分配内存,定义时才分配内存。既然它相当于一个共有变量,你把这些静态成员的定义放在类体内部,当我们每定义一个对象,就定义一次静态成员,那不是犯了“重复定义的错误”了吗!重复定义会导致对一个变量的地址反复的分配空间,那肯定会报错的呀!那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。
为什么静态成员变量的处理必须要用静态成员函数?
我在之前说了,静态成员是类级别的,那当然要门当户对了,而且他们是所有同类类型对象所共有的,在静态成员函数中,如果出现普通成员函数this指针指向何方?这个就乱套了。因此静态成员函数是静态成员变量的专属处理函数,反过来,静态成员变量也是静态成员函数的专属操作对象。