Почему он присваивает значение мусора переменной ‘calc’?

#c #oop

Вопрос:

Эта программа присваивает переменной мусорное значение calc .

Кто-нибудь может мне помочь? В чем здесь проблема?

Код:

 #include <iostream>
using namespace std;

class trial {
public:
    int m1;
    int m2;
    int calc = m1   m2;
    void setdata(int a1, int a2) {
        m1 = a1;
        m2 = a2;
    }
    void getcalc(){
        cout << "Sum of m1 amp; m2 is " << calc << endl;
    }
};

int main() {
    trial t1;
    t1.setdata(3, 8);
    t1.getcalc();
    system("pause>0");
    return 0;
}
 

Выход:

 Sum of m1 amp; m2 is -1717986920
 

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

1. Вы устанавливаете calc ` int calc = m1 m2;` с неинициализированными значениями. Вы хотите установить calc после установки m1 и m2

2. int calc = m1 m2; расчет выполняется, когда trial он был построен раньше m1 и m2 имеет значения. Помните, что c выполняет это как задание 1 раз. Это не похоже на электронную таблицу, где переменная пересчитывается при изменении значений.

3. Удалите int calc = m1 m2; и выполните вычисления void getcalc(){ Для лучшего дизайна класса, который вы, возможно, захотите удалить void setdata(int a1, int a2) { , а вместо этого добавьте конструктор в свой пробный класс, который инициализирует m1 и m2 создает.

4. Этот вопрос мог бы быть лучше, если бы вы объяснили, почему, по вашему мнению calc , в нем не должно быть мусора? В какой момент вы присваиваете ему значение, не являющееся мусором?

Ответ №1:

Проблема в том, как вы определили calc .

Когда объект trial инициализируется, m1 m2 присваивается calc , но m1 и m2 сами не инициализируются (они содержат «мусор»).

При setdata() вызове два предоставленных пользователем целых числа присваиваются m1 и m2 , но calc не изменяются, таким образом, «мусор» в выводе.

Вам нужно обновить calc , добавив calc = m1 m2; setdata() .

Ответ №2:

Вы никогда не вычисляете сумму с первого места …

 void setdata(int a1, int a2) {
        m1 = a1;
        m2 = a2;
        calc = m1   m2;
    }
 

но всегда инициализируйте переменные-члены, вы не инициализируете m1 и m2, следовательно, значения мусора, которые присваивает компилятор.