C++ 我的课怎么了

C++ 我的课怎么了,c++,function,class,object,constructor,C++,Function,Class,Object,Constructor,我不知道为什么,但当我用我的类创建一个对象并使用默认构造函数时,当我试图将名为cash的变量传递给访问器user2.setCash(cash)哪个目的是将cash主要设置为new\u cash,它会给出一个很大的值,比如1.22256e+461。为什么会这样?如果我使用重载构造函数,它可以正常工作 main.cpp #include <iostream> #include <string> #include "Bank.h" using namespace std;

我不知道为什么,但当我用我的类创建一个对象并使用默认构造函数时,当我试图将名为cash的变量传递给访问器
user2.setCash(cash)
哪个目的是将
cash
主要设置为
new\u cash
,它会给出一个很大的值,比如
1.22256e+461
。为什么会这样?如果我使用重载构造函数,它可以正常工作

main.cpp

#include <iostream>
#include <string>
#include "Bank.h"

using namespace std;

int main()
{
    string name;
    int id;
    double cash;

bank user2;
cout << "\n\nPlease type your name: ";
getline(cin >> ws, name);
user2.setName(name);
cout << "Enter an id number: ";
cin >> id;
user2.setID(id);
cout << "Enter your cash: ";
cin >> cash;
cout << cash << endl;
user2.setCash(cash);
cout << "\nAlright " << user2.getName() << ", current cash: " << user2.getCash();
cout << "\nChoose how much would you like to Deposit: ";
cin >> cash;
user2.deposit(cash);
cout << "New amount is: " << user2.getCash() << " For user ID: " << user2.getID() << "\n\n";
bank::printStatic();

return 0;
}
#包括
#包括
#包括“Bank.h”
使用名称空间std;
int main()
{
字符串名;
int-id;
双倍现金;
银行用户2;
cout>ws,name);
user2.setName(name);
cout>id;
user2.setID(id);
现金;

cout您需要初始化构造函数中的所有基元类型成员

否则会得到不确定的值

此外,非默认构造函数也有缺陷:

// Default Constructor
bank::bank()
{
    int new_id = 0; 
    double new_cash = 0.0;
 ....
^设置局部变量的值,而不是成员变量的值


我建议使用初始化列表:

// Default Constructor
bank::bank() : new_name(), new_id(0), new_cash(0.0)
{
    ++num_of_accounts;
}

// Overload Constructor
bank::bank(string name, int id, double cash)
    : new_name(name), new_id(id), new_cash(cash)
{
    ++num_of_accounts;
    total_cash += new_cash;
}
您还可以将两者结合起来:

bank::bank(string name = "", int id = 0, double cash = 0.0)
    : new_name(name), new_id(id), new_cash(cash)
{
    ++num_of_accounts;
    total_cash += new_cash;
}

在默认构造函数中,您将使用与成员变量相同的名称声明局部变量。然后您将设置这些局部变量,而不是分配成员。请删除类型声明,使它们成为正常分配

bank::bank()
{
    new_id = 0;
    new_cash = 0.0;
    ++num_of_accounts; // New object is created e.g. a person so total accounts must be increased.
}

为什么不使用调试器并进行逐步调试?请尝试将代码简化为再现问题的代码。在该练习中,您最有可能自己找到错误,如果没有,您将有更好的机会得到好的答案。请清楚代码的作用和您希望它做的事情。“[I]t给出一个大值,比如1.222256e+461或类似的值”为提高清晰度留出了空间。这是针对特定问题指出的许多代码的方式。请明确!投票结束。这一点。另一个ctor中有一个bug。Updating@Johnson:否。只有一个错误是您无意中在默认的ctor中定义了两个局部变量,而没有分配成员。@Johnson Youtube糟透了。At至少在这里,说真的!哦,是的,我发现我在默认设置中意外地将声明的2个变量放在了cheers上!你算出了这一部分。祝分配的其余部分好运谢谢我的朋友,我认为字符串如果不初始化总是空的(这是youtube教程系列中的一个家伙说的)因此,他说没有必要将其初始化为null或空。您实际上不需要初始化新的\u名称(因为非原语在order或member声明中得到默认构造)。此外,
new\u name=“”
是赋值,不是初始化。@sehe:如果没有以其他方式专门初始化,则所有成员都是默认初始化的。这可能意味着对某些类型未初始化。可能需要扩展注释…@Deduplicator是的。这就是为什么我仔细选择我的单词。在一个comm中放置多少信息是一个平衡点呃,你很恰当地补充说:“删除副本可能是你应该考虑偶尔参加聊天室。”
bank::bank(string name = "", int id = 0, double cash = 0.0)
    : new_name(name), new_id(id), new_cash(cash)
{
    ++num_of_accounts;
    total_cash += new_cash;
}
bank::bank()
{
    new_id = 0;
    new_cash = 0.0;
    ++num_of_accounts; // New object is created e.g. a person so total accounts must be increased.
}