• C++课程第三次作业——静态成员


    昵称 JusticeXu
    学号后六位 061409
    博客园链接 JusticeXu的博客园
    作业链接 C++课程第三次作业

    Part1 基本知识点

    1)静态数据成员

    面向对象方法中有一个”类属性“的概念。如果某个属性为整个类所共用,不属于任何一个具体对象,则用static关键字来声明为静态成员。静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。类属性是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值是相同的。

    静态数据成员具有静态生存期。由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问,一般用法是类名::标识符。在类的定义中仅仅对静态数据成员进行引用性声明,必须在命名空间作用域的某个地方使用类名限定定义性声明,这时也可以进行初始化。

    eg:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          static int objectCount;
          // 构造函数定义
          Box(double l=2.0, double b=2.0, double h=2.0)
          {
             cout <<"Constructor called." << endl;
             length = l;
             breadth = b;
             height = h;
             // 每次创建对象时增加 1
             objectCount++;
          }
          double Volume()
          {
             return length * breadth * height;
          }
       private:
          double length;     // 长度
          double breadth;    // 宽度
          double height;     // 高度
    };
     
    // 初始化类 Box 的静态成员
    int Box::objectCount = 0;
     
    int main(void)
    {
       Box Box1(3.3, 1.2, 1.5);    // 声明 box1
       Box Box2(8.5, 6.0, 2.0);    // 声明 box2
     
       // 输出对象的总数
       cout << "Total objects: " << Box::objectCount << endl;
     
       return 0;
    }
    

    运行结果:

    小结:

    上面的例子中,类box的数据成员objectCount被声明为静态,用来给box类的对象计数,每定义一个新的对象,count的值+1。静态数据成员objectCount的定义和初始化在类外进行,初始化时引用的方式也很值得注意,首先应该注意的是要利用类名进行引用,其次,虽然这个静态数据成员是私有类型,在这里却可以直接初始化。除了这种特殊场合,在其他的地方,例如主函数中就不允许直接访问了。

    Attention:

    类的静态数据成员需要在类定义之外再加以定义,是因为需要以这种方式专门为它们分配空间。非静态数据成员无须以此方式定义,因为它们的空间是与它们所属对象的空间同时分配的。

    2)静态函数成员

    静态函数成员就是使用static关键字声明的函数成员。同静态数据成员一样,静态成员函数也属于整个类,由同一个类的所有对象共同拥有,为这些对象共享。

    静态成员函数可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。

    习惯 虽然静态成员函数可以通过类名和对象名两种方式调用,但一般习惯于通过于通过类名调用。因为即使通过对象名调用,起作用的也只是对象的类型信息,与所使用的具体对象无关系。

    静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态成员,必须通过对象名

    eg:

    一般情况下,它主要用来访问同一类中的静态数据成员,维护对象之间共享的数据。

    Part2 静态函数成员与普通函数成员的对比

    如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也能被调用,静态函数只要使用类名加范围解析运算符 :: 就可以访问。

    静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。

    静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。

    静态成员函数与普通成员函数的区别:

    • 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
    • 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。

    我们来做以下实验:

    #include <iostream>
     
    using namespace std;
     
    class Box
    {
       public:
          static int objectCount;
          // 构造函数定义
          Box(double l=2.0, double b=2.0, double h=2.0)
          {
             cout <<"Constructor called." << endl;
             length = l;
             breadth = b;
             height = h;
             // 每次创建对象时增加 1
             objectCount++;
          }
          double Volume()
          {
             return length * breadth * height;
          }
          static int getCount()
          {
             return objectCount;
          }
       private:
          double length;     // 长度
          double breadth;    // 宽度
          double height;     // 高度
    };
     
    // 初始化类 Box 的静态成员
    int Box::objectCount = 0;
     
    int main(void)
    {
      
       // 在创建对象之前输出对象的总数
       cout << "Inital Stage Count: " << Box::getCount() << endl;
     
       Box Box1(3.3, 1.2, 1.5);    // 声明 box1
       Box Box2(8.5, 6.0, 2.0);    // 声明 box2
     
       // 在创建对象之后输出对象的总数
       cout << "Final Stage Count: " << Box::getCount() << endl;
     
       return 0;
    }
    

    运行结果:

    Part3 总结

    我们用static关键字来声明为静态数据成员或者静态函数成员。静态成员在每个类只有一个副本,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/codingbyjusticexu/p/11566896.html
Copyright © 2020-2023  润新知