在 C++ 中,类 的静态成员可以实现多个 对象 之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。
静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
我们在访问类的静态成员时,既可以使用类名来访问也可以使用对象名来访问。
静态数据成员在定义或说明时前面加 关键字 static。
class ClassName
{
public:
static Type paramter;
};
参数 | 描述 |
---|---|
static | 定义静态成员使用的关键字。 |
Type | 静态成员类型名。 |
paramter | 静态成员变量名。 |
我们在类 ClassName 中,定义了一个静态成员 paramter,其类型为 Type。
静态成员在定义后,必须要进行初始化。
静态成员在定义后,必须要进行初始化。
Type ClassName::paramter=value;
参数 | 描述 |
---|---|
Type | 静态成员类型名。 |
ClassName | 静态成员类名。 |
paramter | 静态成员变量名。 |
value | 静态成员需要初始化的值。 |
静态成员初始化在类体外进行,而前面不加 static,(这点需要注意)以免与一般静态变量或对象相混淆。且初始化时不加该成员的访问权限控制符 private,public 等。
初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
静态成员的引用可以使用类名或者对象名引用。
ClassName::paramter
参数 | 描述 |
---|---|
ClassName | 静态成员类名。 |
paramter | 静态成员变量名。 |
通过类名访问静态属性
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
cout << "Call Student" << endl;
}
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
cout << "Student::course = " << Student::course << endl;
return 0;
}
程序运行后,控制台输出如下:
我们创建了一个类 Student,接着,为该类添加了一个静态属性 score
,并且,我们在类外面初始化了该类的静态成员,最后,我们可以直接使用 “Student::score” 的形式来访问静态属性。
通过对象名访问静态属性
#include <iostream>
using namespace std;
class Student
{
public:
Student()
{
}
static string course;
};
string Student::course = "C++";
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
Student stu;
cout << "stu course = " << stu.course << endl;
Student stu1;
cout << "stu1 course = " << stu1.course << endl;
stu1.course = "Python";
cout << "stu course = " << stu.course << endl;
cout << "stu1 course = " << stu1.course << endl;
return 0;
}
程序运行后,控制台输出如下:
这次,我们使用了类的对象 stu 和 stu1 分别访问了类的静态成员,同时,我们使用对象 stu1 修改了静态属性 course 的值,最后,我们可以看到,stu 对象的 course 值和 stu1 对象的 course 值都被修改了。
因为,静态成员的值是所有对象所共有的。
在 C++ 中,类的静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的