想更新公司网站怎么做,沈阳高端网站开发建设,媒介星软文平台官网,未来中森网站建设在C中#xff0c;我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量#xff0c;它被关键字static修饰#xff0c;例如#xff1a;
class Student{
public:Student(char *name, int age, float score);void show();
public:static …在C中我们可以使用静态成员变量来实现多个对象共享数据的目标。静态成员变量是一种特殊的成员变量它被关键字static修饰例如
class Student{
public:Student(char *name, int age, float score);void show();
public:static int m_total; //静态成员变量
private:char *m_name;int m_age;float m_score;
};这段代码声明了一个静态成员变量 m_total用来统计学生的人数。
static 成员变量属于类不属于某个具体的对象即使创建多个对象也只为 m_total 分配一份内存所有对象使用的都是这份内存中的数据。当某个对象修改了 m_total也会影响到其他对象。
static 成员变量必须在类声明的外部初始化具体形式为
type class::name value;type 是变量的类型class 是类名name 是变量名value 是初始值。将上面的 m_total 初始化
int Student::m_total 0;静态成员变量在初始化时不能再加 static但必须要有数据类型。被 private、protected、public 修饰的静态成员变量都可以用这种方式初始化。
注意static 成员变量的内存既不是在声明类时分配也不是在创建对象时分配而是在类外初始化时分配。反过来说没有在类外初始化的 static 成员变量不能使用。
static 成员变量既可以通过对象来访问也可以通过类来访问。请看下面的例子
//通过类类访问 static 成员变量
Student::m_total 10;//通过对象来访问 static 成员变量
Student stu(小明, 15, 92.5f);
stu.m_total 20;//通过对象指针来访问 static 成员变量
Student *pstu new Student(李华, 16, 96);
pstu - m_total 20;这三种方式是等效的。
注意static 成员变量不占用对象的内存而是在所有对象之外开辟内存即使不创建对象也可以访问。
下面来看一个完整的例子
#include iostream
using namespace std;class Student{
public:Student(char *name, int age, float score);void show();
private:static int m_total; //静态成员变量
private:char *m_name;int m_age;float m_score;
};//初始化静态成员变量
int Student::m_total 0;Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){m_total; //操作静态成员变量
}
void Student::show(){coutm_name的年龄是m_age成绩是m_score当前共有m_total名学生endl;
}int main(){//创建匿名对象(new Student(小明, 15, 90)) - show();(new Student(李磊, 16, 80)) - show();(new Student(张华, 16, 99)) - show();(new Student(王康, 14, 60)) - show();return 0;
}运行结果
小明的年龄是15成绩是90当前共有1名学生
李磊的年龄是16成绩是80当前共有2名学生
张华的年龄是16成绩是99当前共有3名学生
王康的年龄是14成绩是60当前共有4名学生上例中将 m_total 声明为静态成员变量每次创建对象时会调用构造函数使 m_total 的值加 1。
之所以使用匿名对象是因为每次创建对象后只会使用它的 show() 函数不再进行其他操作。不过使用匿名对象无法回收内存会导致内存泄露在中大型程序中不建议使用。
解析说明
1 一个类中可以有一个或多个静态成员变量所有的对象都共享这些静态成员变量都可以引用它。
2 static 成员变量和普通 static 变量一样都在内存分区中的全局数据区分配内存到程序结束时才释放。这就意味着static 成员变量不随对象的创建而分配内存也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存在对象销毁时释放内存。
3 静态成员变量必须初始化而且只能在类体外进行。例如
int Student::m_total 10;初始化时可以赋初值也可以不赋值。如果不赋值那么会被默认初始化为 0。
4 静态成员变量既可以通过对象名访问也可以通过类名访问但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时对于不同的对象访问的是同一份内存。