【问题标题】:Need help understanding constructor parameter and static variables需要帮助理解构造函数参数和静态变量
【发布时间】:2013-11-30 17:24:24
【问题描述】:

这是一个简单的程序

#include <iostream>
using namespace std;

class Employee
{
    public:

    Employee(string="default", int=10){};
    void display();

    private:
    static int x;
    static string s;
};
int Employee::x=7;
string Employee::s="Johnson";
void Employee::display()
{
    cout << s << x << endl;
}


int main()
{
    int num;
    string name;
    Employee e1;
    Employee e2("Arthur",33);
    e2.Employee::display();

}

我有以下问题

1) 我需要帮助理解为什么程序的输出是Johnson7 而不是Arthur33(我知道它与静态变量有关)

2) 通常构造函数是这样定义的 Employee(string,int)

构造函数中的参数string="default",int=10是什么意思

Employee(string="default", int=10){};

其实意思???

【问题讨论】:

    标签: c++ class oop static


    【解决方案1】:

    1) 我需要帮助理解为什么程序的输出是 Johnson7 而不是 Arthur33(我知道它与静态变量有关)

    因为display() 打印静态数据成员。构造函数根本不会影响它。事实上,它对它的论点没有任何作用。

    2) 通常构造函数定义为 Employee(string,int)。构造函数中的参数string="default",int=10是什么意思

    这些是默认参数。这意味着如果您不提供部分或全部参数,则会采用默认值。例如:

    void foo(int i = 42, double d = 3.1416);
    
    foo(1, 2.3); // calls with i = 1, d = 2.3
    foo(1); // calls with i = 1, d = 3.1416
    foo(); // calls with i = 42, d = 3.1416
    

    这在您的示例中无效,因为您的构造函数无论如何都不会对参数做任何事情。

    这些东西在最基本的 C++ 书籍中都有解释。看看the definitive list

    【讨论】:

      【解决方案2】:
      cout << s << x << endl;
      

      打印 s 后跟 x,分别设置为 Johnsen 和 7。

      您对Employee e2("Arthur",33); 的调用实际上什么也没做,构造函数会忽略您提供给它们的参数。 x 和 s 不会被覆盖。

      静态变量意味着它们不绑定到类的特定实例。所以对于 e1 和 e2 来说,x 和 s 指的是同一个变量和同一块内存。

      如果您希望 x 和 s 成为实例成员(因此它们对于 e1 和 e2 可以不同),您应该删除 static 关键字并实现构造函数:

         Employee(string s="default", int x =10):x(x), s(s) {} 
         void display();
      
      private:
          int x;
          string s;
      

      去掉x和s的定义:

      int Employee::x=7;
      string Employee::s="Johnson";
      

      "default" 和 10 是构造函数参数的默认值,所以如果你像这样实例化一个员工:

      Employee e3;
      

      s 将是“默认”并且 x=10

      【讨论】:

        【解决方案3】:

        如果您意识到这不是真正有用的代码,这可能有助于理解代码。通常你会期望一个“Employee”对象可能有一个“name”和一个“age”,而下一个“Employee”对象也有一个“name”和“age”,但很可能是不同的。您会期望有一个构造函数采用“name”和“age”参数,并将它们存储在“Employee”对象中。这就是任何理智的人都会编写代码的方式。

        然而,这段代码看起来不像是由一个理智的人编写的。有两个“静态”类变量 x 和 s。在这里,“静态”意味着这些变量对于每个员工对象不存在一次,但每个类只存在一次。 “display”方法不显示有关该特定员工的数据,但它显示两个静态变量。这意味着,无论您使用什么 Employee 对象,调用“display”将始终显示相同的值。

        有一个带有默认参数的构造函数,但由于每个对象都没有变量,这些参数没有任何用处,所以它只是忽略它们。因此,您在构造函数中作为参数传递的内容,或者是否传递任何内容,都没有任何区别。正如我所说,代码看起来不像是由一个理智的人编写的。

        (Jasper 的代码是一个理智的人编写它的方式,因此它的行为方式与您期望的一样有用)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多