在c++中,经常可以看到static开头的语句,那么这就是在定义静态成员数据或者静态成员函数了。
静态成员数据
类中的某个数据一旦被定义为静态成员数据,那么这个数据就可以被由这个类创建的任何对象共享。这个数据就是静态成员数据。
注意:一般,类只是定义了其结构、类型,而创建对象时才会分配内存空间。比如一个Student类,其中有一个成员数据totalNumber,且由这个类创建了10个对象,则就会开辟十个相应的空间存储对象,且totalNumber被存在了这个十个对象,处于不同的位置,然而,totalNumber是相同的,如果存储了10份,就会造成浪费,所以出现了静态成员数据的概念。但是,这个静态数据成员只能在类之外进行初始化,在类的里面是不能进行初始化的。 且对静态成员数据访问时,既可以通过创建的对象访问(使用 . 访问符),也可以使用这个类来进行访问(使用 :: 进行访问),举例如下:
#include <windows.h> #include <iostream> #include <string> using namespace std; class Student { public: static int totalNumber; int getAge() { return this->age; } Student(string name = "wayne", int age = 22, string sex = "male") { name = name; age = age; sex = sex; // 每创建一次对象,totalNumber值加1 totalNumber++; } private: string name; int age; string sex; }; int Student::totalNumber = 0; int main() { cout << "this is the beginning!" << endl; Student wayne("wayne", 22, "male"); Student hedy("hedy", 18, "female"); Student brother("brother", 24, "male"); cout << "创建的学生总数为:" << Student::totalNumber << endl; cout << "创建的学生总数为:" << wayne.totalNumber << endl; return 0; }
如上所示:
- 我们定义了Student类,并且设置了totalNumber为静态成员函数,并且静态成员函数在类之外初始化,而不能在类里初始化。
- getAge中使用了this->age,因为这些数据成员是有this指针的,另外注意我们构造函数的使用。
- 因为totalNumber是静态成员函数,所以我们可以使用 类::静态成员函数 的方式访问。另外,我们通过 对象.成员函数 也是可以访问的,并且最终结果相同。
静态成员函数
静态成员函数同样也是在类中的函数前加上 static 关键词。同样的,静态成员函数可以通过 类名::静态成员函数 的方式进行访问。
静态成员函数不能访问类中的一般函数和数据,只能访问类中的静态成员函数,静态成员变量,或者类外的其他函数,这是因为静态成员函数中是没有this指针的。
如下所示:
#include <windows.h> #include <iostream> #include <string> using namespace std; class Student { public: static int totalNumber; int getAge() { return this->age; } Student(string name = "wayne", int age = 22, string sex = "male") { name = name; age = age; sex = sex; // 每创建一次对象,totalNumber值加1 totalNumber++; } static int getTotal() { return totalNumber; } private: string name; int age; string sex; }; int Student::totalNumber = 0; int main() { cout << "this is the beginning!" << endl; Student wayne("wayne", 22, "male"); Student hedy("hedy", 18, "female"); Student brother("brother", 24, "male"); cout << "创建的学生总数为:" << Student::getTotal() << endl; cout << "创建的学生总数为:" << wayne.getTotal() << endl; return 0; }
可以看到: 上面的程序中,我们可以使用静态成员函数getTotal访问静态成员数据,并且,同样的,静态成员函数是属于类的,无论创建了多少对象,都只会占用一份内存。且可以通过两种方式来进行访问。