【问题标题】:Why it is assigning a garbage value to variable 'calc'?为什么将垃圾值分配给变量'calc'?
【发布时间】:2021-10-09 14:33:22
【问题描述】:

这个程序给变量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 & m2 is " << calc << endl;
    }
};

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

输出:

Sum of m1 & m2 is -1717986920

【问题讨论】:

  • 您将 calc ` int calc = m1 + m2;` 设置为未初始化的值。你想在设置 m1 和 m2 后设置 calc
  • int calc = m1 + m2; 计算发生在trialm1m2 有值之前构造时。请记住,c++ 将其作为 1 次分配执行。它不像电子表格,当值发生变化时会重新计算变量。
  • 删除 int calc = m1 + m2; 并在 void getcalc(){ 中进行计算 为了更好的类设计,您可能希望删除 void setdata(int a1, int a2) { 并在您的试用类中添加一个构造函数来初始化 m1 和 @987654332 @关于建设。
  • 如果你解释一下为什么你认为calc 里面不应该有垃圾,这个问题可能会更好?在什么时候给它分配一个非垃圾值?

标签: c++ oop


【解决方案1】:

问题在于你如何定义calc

当对象trial被初始化时,m1+m2被分配给calc,但m1m2本身并没有被初始化(它们包含“垃圾”)。

setdata()被调用时,两个用户提供的整数被分配给m1m2,但是calc没有改变,因此输出中的'垃圾'。

您需要通过在setdata() 中添加calc = m1 + m2; 来更新calc

【讨论】:

    【解决方案2】:

    你永远不会首先计算总和......

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

    但总是初始化成员变量,你没有初始化 m1 和 m2,因此是编译器分配的垃圾值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2016-02-10
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多