1.静态数据成员
1.描述
在类中,如果某个属性为整个类所共有,不属于类的任何一个对象,则为类的静态成员,用 static 关键字声明,静态成员在每个类中只有一份,由类的所有对象共同维护和使用;
2.特点:
静态数据成员具有静态生存期(与动态生存期区别,类似于全局变量);
静态数据成员需要定义两次,类内类外各定义一次,为它们分配专门的空间,
3.例子:
简单学生信息记录系统,用静态数据成员count记录总学生数
#include<bits/stdc++.h> using namespace std; class Student{ public: Student(int age1=0,int weight1=0)//默认构造函数 { age=age1; weight=weight1; count++;//调用默认构造函数时个数加一 } Student(Student &st)//复制构造函数 { age=st.age; weight=st.weight; count++;//调用复制构造函数时个数加一 } ~Student()//析构函数 { count--; } int reAge(int age1){age=age1;}//修改年龄 int reweight(int weight1){weight=weight1;}//修改体重 int getAge(){return age;}//获得年龄 int getweight(){return weight;}//获得体重 int getcount() { return count;//获得人数 }//对外接口 private: int age; int weight; static int count;//内部声明静态数据成员 }; int Student::count=0;//外部声明 赋值并分配专门空间 int main() { Student a(12,120); cout<<a.getcount(); cout<<endl;//调用默认构造函数并查看总人数 a.reAge(13); cout<<a.getAge()<<" "<<a.getcount(); cout<<endl;//调用修改函并查看总人数 Student b=a; cout<<b.getAge()<<" "<<b.getcount(); //调用复制构造函数并查看总人数 return 0; }
结果:
2.静态函数成员
1.描述
在静态数据成员中,要输出count时必须通过一个具体对象调用函数才能输出count的值,但是在声明对象之前无法输出count的值,即使这时count的值为 0 ,这时我们可以用静态成员函数来访问静态数据成员,一般用类名来访问;
2.特点:
静态函数成员一般通过类名来调用,访问非静态的函数成员必须通过对象名调用;
只需在调用静态数据成员的函数前加上 static 关键字;
通过 类名::函数名来调用静态函数成员
3.例子:
在静态数据成员的基础上改写函数:
#include<bits/stdc++.h> using namespace std; class Student{ public: Student(int age1=0,int weight1=0)//默认构造函数 { age=age1; weight=weight1; count++;//调用默认构造函数时个数加一 } Student(Student &st)//复制构造函数 { age=st.age; weight=st.weight; count++;//调用复制构造函数时个数加一 } ~Student()//析构函数 { count--; } int reAge(int age1){age=age1;}//修改年龄 int reweight(int weight1){weight=weight1;}//修改体重 int getAge(){return age;}//获得年龄 int getweight(){return weight;}//获得体重 static int getcount() { return count;//获得人数 }//对外接口 private: int age; int weight; static int count;//内部声明静态数据成员 }; int Student::count=0;//外部声明 赋值并分配专门空间 int main() { cout<<Student::getcount();//未声明任何对象但是查看人数 cout<<endl; Student a(12,120); cout<<Student::getcount(); cout<<endl;//调用默认构造函数并查看总人数 a.reAge(13); cout<<a.getAge()<<" "<<Student::getcount(); cout<<endl;//调用修改函并查看总人数 Student b=a; cout<<b.getAge()<<" "<<Student::getcount(); //调用复制构造函数并查看总人数 return 0; }
结果:
3.小结:
静态数据成员就像全局变量一般,有全局的生存期,是所有类和对象共同使用和维护属性,而静态函数成员有能很方便地调用静态数据成员,很好地完成了数据的共享;