需要帮助理解构造函数参数和静态变量

时间:2013-11-30 17:24:24

标签: c++ class oop static

这是一个简单的程序

#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 的参数是什么

  

员工(string =“default”,int = 10){};

实际上意味着???

3 个答案:

答案 0 :(得分:2)

  

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

答案 1 :(得分: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;

将是“默认”,x = 10

答案 2 :(得分:0)

如果您意识到这不是真正的代码可以做任何有用的事情,它可能有助于理解代码。通常你会期望一个&#34;员工&#34;对象可能有一个&#34; name&#34;和#34;年龄&#34;并且下一个&#34;员工&#34;对象也有一个&#34;名称&#34;和#34;年龄&#34;但很可能是另一个。并且你会期望有一个构造函数采用&#34;名称&#34;和&#34;年龄&#34;参数,并将这些存储在&#34;员工&#34;宾语。这就是任何理智的人如何编写代码。

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

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

(贾斯珀的代码是一个理智的人如何写它,因此它的行为方式与你期望的一样有用)。