Почему этот код не может вернуть переменную bpEffect со значением 505.5?

#c #c 11 #visual-c #class-constructors

#c #c 11 #visual-c #конструкторы классов

Вопрос:

Ожидаемый результат от следующего кода должен быть 505.5, но вместо этого он возвращает 3.97541e 70. Почему это так и как можно решить проблему?

 #include <iostream>
#include <string>
using namespace std;
class Position {
public:
    Position(int s, double p, string n) {
        shares = s;
        price = p;
        name = n;
    }
    double getBpEffect() {
        return bpEffect;
    }
private:
    string name;
    int shares;
    double price;
    double bpEffect = (shares*price) / 2;

};


int main() {
    Position xyz = Position(100, 10.11, "xyz");
    double buyingPower = xyz.getBpEffect();


    cout << buyingPower;

    system("pause");
    return 0;

}
  

Комментарии:

1. (shares*price) / 2 происходит слишком рано, перед инициализацией shares и price . Вы выполняете арифметику со случайным мусором, поэтому, конечно, вы удаляете мусор. Инициализируйте bpEffect после присвоения значений shares и price .

2. Игорь прав. Вы должны вводить (shares*price) / 2 в метод, такой как ваш конструктор, а не в качестве инициализирующей инструкции в вашем коде.

3. как сказал Игорь Тандетник, вы управляете мусором; ввод мусора подразумевает вывод мусора; Решение очевидно: Position(int s, double p, string n): name{n}, shares{s}, price{p}, bpEffect{(shares*price)/2} {}

Ответ №1:

double bpEffect = (shares*price) / 2; выполняется перед телом вашего конструктора с использованием неопределенных значений в shares и price . Вам нужно вычислить bpEffect после инициализации других переменных.

Ответ №2:

Показанный класс инициализируется смесью кода конструктора и явной инициализации члена.

Если порядок, в котором происходят различные фрагменты построения класса, не полностью понятен, довольно легко заставить все происходить в неправильном порядке.

Лучшее, что можно сделать, это инициализировать все в одном месте, удалив всю двусмысленность:

 Position(int s, double p, string n)
   : name(n), shares(s), price(p),
     bpEffect((shares*price) / 2)
{
}