C++ 使用类和数组:为什么我的输出内存位置是?

C++ 使用类和数组:为什么我的输出内存位置是?,c++,arrays,class,c++11,for-loop,C++,Arrays,Class,C++11,For Loop,我试图将4个不同的值传递给固定数组的每个元素。但是,当我尝试输出时,控制台输出的是内存位置,而不是我希望看到的值。该程序的目的是使用数组存储员工数据,并使用for循环遍历数据并将其打印到控制台。为了将数组的输出从内存位置转换为所需的值,我必须添加什么 #include <iostream> #include <cmath> #include <string> using namespace std; class Employee { int emp

我试图将4个不同的值传递给固定数组的每个元素。但是,当我尝试输出时,控制台输出的是内存位置,而不是我希望看到的值。该程序的目的是使用数组存储员工数据,并使用for循环遍历数据并将其打印到控制台。为了将数组的输出从内存位置转换为所需的值,我必须添加什么

#include <iostream>
#include <cmath>
#include <string>

using namespace std;

class Employee
{
    int empNumber;
    string name;
    double hours, payRate;

public:
    Employee()
    {
        int empNumber = 0;
        double hours=0, payRate = 0;
        string name = "Name";
    }

    Employee(int empNmb, double hrs, double payRT, string nm)
    {
        empNumber = empNmb;
        hours = hrs;
        payRate = payRT;
        name = nm;
    }

    void getEmployeeData()
    {
        for (int i = 0; i < 4; i++)
        {
            cout << empNumber;
            cout << hours;
            cout << payRate;
            cout << name;
        }

    }
};

int main()
{
    Employee e;
    Employee list[4];
    list[0] = Employee(9991, 25, 15, "Jeff");
    list[1] = Employee(8791, 21, 15, "Mohamed");
    list[2] = Employee(9211, 15, 35, "Mary");
    list[3] = Employee(5271, 35, 15, "Bob");


    e.getEmployeeData();

    system("Pause");
    return 0;
}

构造函数正在初始化具有与成员相似名称的局部变量。事实上,如果您使用g++进行编译,如果您在编译中放置了-Wall标志,它将警告您

也可以,C++不必根据构造函数中的顺序来初始化成员,它可以按照声明的顺序初始化,因此,总是按照声明的顺序初始化成员!!!!这可能会导致难以调试的错误

您的代码应该是:

#include <string>

class Employee
{
    int empNumber;
    double hours;
    double payRate;
    std::string name;


public:
    Employee() : 
        empNumber(0),
        hours(0),
        payRate(0),
        name("Name")
    {
    }

    Employee(int empNmb, double hrs, double payRT, std::string nm) :
        empNumber(empNmb),
        hours(hrs),
        payRate(payRT),
        name(nm)
    {
    }
};

首先,您需要修改getEmployeeData函数,如下所示:

void getEmployeeData()
{
    cout << empNumber<<" ";
    cout << hours << " ";;
    cout << payRate << " ";;
    cout << name << " ";;
}
然后用以下代码替换主代码:

int main()
{
Employee e[4];
e[0] = Employee(9991, 25, 15, "Jeff");
e[1] = Employee(8791, 21, 15, "Mohamed");
e[2] = Employee(9211, 15, 35, "Mary");
e[3] = Employee(5271, 35, 15, "Bob");

for (int i = 0; i < 4; i++)
{
    e[i].getEmployeeData();
    cout << endl;
}

system("Pause");
return 0;
}

早期代码的问题在于,您使用的不是您创建的列表,而是该类的其他实例。

这是因为int-empNumber=0;不会做你认为它会做的事。双倍工作小时数=0,工资率=0;也不是;,nor字符串名称=名称;。这不是在构造函数中初始化类成员的方式。所有这些语句所做的就是创建局部变量,其名称恰好与类成员相同。但并不真正初始化实际的类成员。有关构造函数中初始化类成员的更多信息和许多示例,您应该查看C++的书籍。GETAuthEdEATA成员正在打印四次未经触碰的、看似没有意义的对象的四个成员的值。填充后,要填充的数组列表将完全未使用。如果您想打印列表的内容,那么循环迭代该数组并打印其中的每个员工。这是否回答了您的问题@奥利弗文图拉补充了我的回答。谢谢!这帮助我让代码正常工作:D
int main()
{
Employee e[4];
e[0] = Employee(9991, 25, 15, "Jeff");
e[1] = Employee(8791, 21, 15, "Mohamed");
e[2] = Employee(9211, 15, 35, "Mary");
e[3] = Employee(5271, 35, 15, "Bob");

for (int i = 0; i < 4; i++)
{
    e[i].getEmployeeData();
    cout << endl;
}

system("Pause");
return 0;
}