#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)
{
}