【问题标题】:The output of this program seems to print '5 0 1' instead of '5 1 1' . I'm unable to figure out why?该程序的输出似乎打印 '5 0 1' 而不是 '5 1 1' 。我无法弄清楚为什么?
【发布时间】:2017-11-20 18:37:45
【问题描述】:

所以这个程序正在打印5 0 1。不应该是5 1 1 吗? data1++ 确实将 f1.data1 增加了 10 究竟来自哪里?我正在使用多个函数,因为我刚刚开始学习对象和类,并试图创造尽可能多的可能性。这真的让我很困惑。

#include <iostream>
using namespace std;

class foo
{
    private:

        int data1; //private data member

    public:

        foo(): data1(0) //Constructor initialising it to 0.
        { }

    void func(foo,foo);

    void display(foo fg) const
    {
        cout<<data1;
        cout<<endl;
        cout<<fg.data1;
    }
};

void foo::func(foo ff,foo fg)
{
    ff.data1=5;
    data1++;
    ff.display(fg);
    cout<<endl<<data1<<endl;
}
int main()
{
    foo f1,f2;
    f1.func(f2,f1);

    return 0;

}

【问题讨论】:

  • 您可以在调试器中单步执行以了解发生了什么。
  • 嗨,欢迎来到 SO,请使用 The TourHow to ask a good question
  • 一个提示是您正在按值传递参数 - 创建副本。你有多少本?更新原件后,副本会发生什么情况?
  • 这不是问题,但您真的需要std::endl 需要的额外内容吗? '\n' 结束一行。

标签: c++ function class object


【解决方案1】:

实际上foo::func 中有三个对象。它们是*thisfffg
foo::func 是按值传递。所以fgf1 的副本,*thisf1
所以data1++ 使this-&gt;data1 == 1fg.data1 仍然是0
注意:调试程序一步步调试是个好办法。

【讨论】:

    【解决方案2】:

    遍历主目录:

    foo f1,f2;
    

    默认构造 f1f2 所以它们的 data1 成员都是 0

    f1.func(f2,f1);
    

    f1 实例上调用func,为参数ff 传递f2 的副本和为参数fg 传递f1 的副本

    内部func

    ff.data1=5;
    

    f2data1 成员设置为5

    data1++;
    

    f1data1 成员从0 变为1,fg 不受影响

    ff.display(fg);
    

    将显示f2(即5)的data1成员,换行,然后是fg(即0)的data1成员

    最后:

    cout<<endl<<data1<<endl;
    

    显示f1data1 成员(即1)

    【讨论】:

    • 'data1 member of fg (which is 0)'部分让我很困惑。您说 data1++ 将 f1 的值从 0 提高到 1,我理解。当我们说 ff.display(与 f2.display 相同)时,我们得到 5,因为对于 f2,data1 是 5。现在当我们说 cout
    • 因为 f2f1 被复制,所以将其添加到遍历中。所以 add 1 只影响f1 .
    • 现在我明白了。万分感谢。 ^_^
    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多