在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访问静态成员数据,并且,同样的,静态成员函数是属于类的,无论创建了多少对象,都只会占用一份内存。且可以通过两种方式来进行访问。 

      静态成员数据和静态成员函数_静态成员_02