1.静态数据成员
(1)静态数据成员不仅可以通过对象访问,还可以直接使用类名进行访问。
class Student
{
public:
string name;
static int age;
};
int main()
{
Student stu1;
cout<<Student::age<<stu1.age;//两种方式都可以
}
(2)静态数据成员是被所有的类对象共享的,也就是说无论创建了多少了对象静态数据成员就只有一份,只要有一个对象修改了静态数据成员,其他对象的该成员也会改变。简单的说,就是所有对象都使用这一个数据成员,并不是每个对象单独一个。
class Student
{
public:
string name;
static int age;
};
int main()
{
Student stu1,stu2;
stu1.age=20;
cout<<stu1.age<<stu2.age;//输出的结果相同
}
(3)静态数据成员其类型可以是当前类的类型,而非静态成员是不可以的,除非是指针。
class Student
{
public:
string name;
static int age;
Student stu1; //错误
static Student stu2; //正确
Student *stu3; //正确
}
2、静态成员函数
(1)静态成员函数只能访问类的静态数据成员,不能访问非静态的数据成员。
(2)静态成员函数不能用const关键字修饰。这是由于const实际上适用于修饰this指针的,而静态成员函数时没有this指针的,所以不能用const。
(3)静态成员函数实现和声明,只能有一处标明static。
三、this指针
class Student
{
public:
string name;
static int age;
int getAge()
{
return age;
}
};
int main()
{
Student stu1,stu2;
stu1.age=20;
stu2.age=30;
cout<<stu1.getAge()<<stu2.getAge();
}
之所以不同对象调用同一个函数,输出结果相同时因为getAge()中有隐藏的this指针,该函数其真实形式是
int getAge(Student *this)
{
return this->age;
}