C++ 为什么输入值在为我的输出显示时会损坏?

C++ 为什么输入值在为我的输出显示时会损坏?,c++,C++,在这段代码中,一旦我运行我的程序,我的死亡率的输出就会被破坏。但是我所有的变量都被定义为double,并且没有变量类型的改变。为什么我的输出损坏了?是因为我的值传递不正确吗 #include <iostream>; #include <iomanip>; using namespace std; //variable definition class Population { private: double population, births

在这段代码中,一旦我运行我的程序,我的死亡率的输出就会被破坏。但是我所有的变量都被定义为double,并且没有变量类型的改变。为什么我的输出损坏了?是因为我的值传递不正确吗

#include <iostream>;
#include <iomanip>;

using namespace std;

//variable definition
class Population
{
    private:
        double population, births, deaths;
        double b_rate, d_rate;

    public:
        void setpopulation(double p);
        void setdeath(double death);
        void setbirth(double b);

        double getdrate();
        double getbrate();
};

void Population::setpopulation(double p)
{
    population = p;
}

void Population::setdeath(double death)
{
    deaths = death;
    d_rate = births / population;
}

void Population::setbirth(double b)
{
    births = b;
    b_rate = births/population;
}

double Population::getdrate()
{
    cout << d_rate << endl;
    return d_rate;
}

double Population::getbrate()
{;
    return b_rate;
}

int main()
{
    Population pop;
    pop.setpopulation(100000);
    pop.setdeath(7500);
    pop.setbirth(8000);
    cout << fixed << setprecision(2);
    cout << "Death rate = " << pop.getdrate() << endl;
    cout << "Birth rate = " << pop.getbrate() << endl;
    return 0;
}
#包括;
#包括,;
使用名称空间std;
//变量定义
阶级人口
{
私人:
人口、出生、死亡增加一倍;
双b_比率、d_比率;
公众:
空集总体(双p);
无效死亡(双重死亡);
无效回生(双b);
双getdrate();
双getbrate();
};
无效填充::设置填充(双p)
{
人口=p;
}
无效人口::setdeath(双重死亡)
{
死亡=死亡;
d_比率=出生/人口;
}
空位填充::setbirth(双b)
{
出生=b;
b_比率=出生率/人口;
}
双种群::getdrate()
{

cout根据您提供的代码,在您正在创建的方法
setdeath
中,您必须在那里使用
death
。但此时出生未初始化,因此它接受垃圾值(在所有情况下都不是零,它可以是任何东西,因为内置默认值未知)这就是为什么你把死亡率弄错了

谢谢


拉吉库马尔

这就是原因。小心点。 这就是你如何称呼你是函数

pop.setpopulation(100000);
pop.setdeath(7500);
pop.setbirth(8000);
这是你的setdeadth()-

因为你主要是先调用setdeadth,再调用SetDeadath。你使用的是未知的出生,或者你可以说出生是未初始化的。所以它是未定义的。 要纠正它,请执行以下操作

pop.setpopulation(100000);
pop.setbirth(8000);
pop.setdeath(7500);

打电话给setbirth fist。顺便说一句,不要认为你的公式是正确的。我不明白你为什么要用出生来计算死亡率。应该是死亡。但我不是指你可能是自愿的。这取决于你。

TBH看起来像是
setdeath
中的一个打字错误,应该是
死亡/population
而不是
出生
,未初始化,因此未定义的行为您应该使用构造函数来设置值。将默认速率设置为0不,速率未初始化,它可以有任何值,使用它是未定义的行为实际上这里没有默认构造函数,在这种情况下,将隐式声明c如中所述的onstructor。根据此解释,成员变量将初始化为默认值。是的,它声明了一个默认构造函数,以便
Population pop
编译,但该构造函数不执行任何操作,类似于编写
Population()=default
Population(){}
其所有成员保持未初始化状态,在初始化它们之前使用其中任何一个都是未定义的行为。请尝试:
Population pop;std::cout我已经添加了更正。它将由零初始化是错误的。在没有类内初始化器的情况下,内置成员是默认初始化的。因此它们不能保证为zero.My bad,只有当对象定义为“Population pop=Population()”时,才会初始化成员,即使提供了默认构造函数,也请遵循线程
pop.setpopulation(100000);
pop.setbirth(8000);
pop.setdeath(7500);