静态成员变量和成员函数
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。类的静态成员,属于类,也属于对象,但终归属于类。
静态成员变量
//声明
static 数据类型 成员变量; //在类的内部
//初始化
数据类型 类名::静态数据成员 = 初值; //在类的外部
//调⽤用
类名::静态数据成员
类对象.静态数据成员
1)static 成员变量实现了同类对象间信息共享。
2)static 成员类外存储,求类大小,并不包含在内。
3)static 成员是命名空间属于类的全局变量,存储在 data 区。
4)static 成员只能类外初始化。
5)可以通过类名访问(无对象生成时亦可),也可以通过对象访问。
静态成员函数
//声明
static 函数声明
//调⽤用
类名::函数调⽤用
类对象.函数调⽤用
1)静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。
2)静态成员函数只能访问静态数据成员。原因:非静态成员函数,在调用时this指针被当作参数传进。而静态成员函数属于类,而不属于对象,没有 this 指针。
class Student
{
public:
Student(int n,int a,float s):num(n),age(a),score(s){}
void total()
{
count++;
sum += score;
}
static float average();
private:
int num;
int age;
float score;
static float sum;
static int count;
};
float Student::sum = 0;
int Student::count = 0;
float Student::average() {
return sum/count;
}
int main()
{
Student stu[3]= {
Student(1001,14,70),
Student(1002,15,34),
Student(1003,16,90)
};
for(int i=0; i<3; i++) {
stu[i].total();
}
cout<<Student::average()<<endl;
return 0;
}
处理机制
C++类对象中的成员变量和成员函数是分开存储的
成员变量:普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态成员变量:存储于全局数据区中
成员函数:存储于代码段中。
1、C++类对象中的成员变量和成员函数是分开存储的。C语言中的内存四区模型仍然有效!
2、C++中类的普通成员函数都隐式包含一个指向当前对象的this指针。
3、静态成员函数、成员变量属于类
4、静态成员函数与普通成员函数的区别:
静态成员函数不包含指向具体对象的指针
普通成员函数包含一个指向具体对象的指针