这是一个简单的程序
#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){};
实际上意味着???
答案 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;将始终显示相同的值。
有一个带默认参数的构造函数,但由于每个对象没有变量,因此对这些参数没有任何用处,所以它只是忽略它们。那么你在构造函数中作为参数传递的内容,或者你是否传递了任何东西,都没有任何区别。正如我所说,代码看起来并不像是一个理智的人写的。
(贾斯珀的代码是一个理智的人如何写它,因此它的行为方式与你期望的一样有用)。