2017-06-18 97 views
-6

所以此程序的打印5 0 1。難道不是5 1 1data1++增加f1.data110從哪裏來?我正在使用多個函數,因爲我剛剛開始學習對象和類,並試圖儘可能多地創造可能性。這真讓我困惑。該程序的輸出似乎打印'5 0 1'而不是'5 1 1'。我無法弄清楚爲什麼?

#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; 

} 
+0

你可以在調試器中查看發生了什麼。 –

+0

您好,歡迎來到SO請參加[The Tour](https://stackoverflow.com/tour)還有[如何提出一個好問題](https://stackoverflow.com/help/how-to-ask) –

+2

[如何調試小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) – zett42

回答

1

實際上在foo::func中有三個對象。它們是*this,fffg
foo::func是傳遞值。所以fgf1*this的副本是f1
所以data1++使得this->data1 == 1fg.data1仍然0
注意:調試程序步驟和步驟是一個好方法。

1

穿行主:

foo f1,f2; 

默認構造f1f2所以無論他們data1成員都在f1實例0

f1.func(f2,f1); 

呼叫funcf2副本傳遞的參數ff和參數fg

的副本 f1

內部func

ff.data1=5; 

可否的f2data1構件設置爲5

data1++; 

碰從0到1的f1data1構件,fg不受影響

ff.display(fg); 

將顯示f2data1構件(即5),新的行,然後的fgdata1構件(其爲0)

最後:

cout<<endl<<data1<<endl; 

顯示的f1data1構件(這是1)

+0

fg(它是0)的部分'data1成員'使我困惑。你說data1 ++將f1的值從0提高到1,這是我的理解。當我們說ff.display(與f2.display相同)時,我們得到5,因爲f2的data1是5。現在當我們說cout << fg.data1時,是不是表示f1.data1是1? fg = f1對不對? f1作爲參數在f2.display()中傳遞,所以我不明白fg的data1成員如何爲0 .. –

+0

因爲'f2'和'f1'被複制,所以將其添加到步驟中。所以add 1隻影響'f1'。 –

+0

現在我明白了。萬分感謝。^_ ^ –

相關問題