#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, следовательно, значения мусора, которые присваивает компилятор.