2012-12-02 63 views
2

我有一個問題,類似於在這裏問的問題:How does "this" cascading work?返回*此,試圖級聯,並沒有返回參考

假設我有以下代碼:

#include <iostream> 
using namespace std; 

class Time 
    { 
    public: 
    Time(int = 0, int = 0, int = 0); 
    Time setHour(int); 
    Time setMinute(int); 
    void print(void); 

    private: 
    int hour; 
    int minute; 
    }; 

    Time::Time(int hr, int mn, int sc) 
    { 
    hour = hr; 
    minute = mn; 
    } 

    void Time::print(void) 
    { 
    cout << "hour = " << hour << endl; 
    cout << "minute = " << minute << endl; 
    } 

    Time Time::setHour(int h) 
    { 
    hour = (h >= 0 && h < 24) ? h : 0; 
    return *this; 
    } 


    Time Time::setMinute(int m) 
    { 
    minute = (m >= 0 && m < 60) ? m : 0; 
    return *this; 
    } 

int main() 
{ 
    cout << "Hello, world!" << endl; 
    Time t; 
    t.setHour(10).setMinute(25); 
    t.print(); 
} 

然後很明顯,函數setMinute(25)沒有在時間對象t上運行。請注意,setHour和setMinute函數不返回對Time對象的引用。

t.setHour(10)執行後發生了什麼?函數setHour以某種方式返回對象t的「副本」,並且setMinute(25)正在副本上運行?我用-Wall編譯了程序,並且沒有錯誤或警告返回。

感謝您的協助。

回答

4

您的分析看起來正確。此表達式

t.setHour(10) 

返回臨時對象Time。然後,您在該臨時電話上致電setMinute(25)。這反過來又返回另一個臨時對象Time,該對象不分配給任何東西。所以setHour()作用於t實例,但setMinute()行爲上的一個臨時,它就會消失在這條線

t.setHour(10).setMinute(25); 
0

每個T的方法結束返回參照噸。引用是別名。所以,如果你做

Time t; 
Time& tAgain = t; 
tAgain.setMinute(25); 
tAgain.setMinute also alters t's time. 

現在外推這個簡單的例子級聯。噸的每個方法返回在表達式本身的引用

Time &Time::setSecond(int s) 
    { 
     second = (s >= 0 && s < 60) ? s : 0; 
     return *this; 
    } 

所以:

t.setHour(10).setMinute(25) 

t.setHour(10)上噸呼叫setHour,然後返回至t的參考。在這種情況下,參考是暫時的。這樣,如果上述線路改爲在評估setHour以下你可以把它想象:

tAgain.setMinute(25); 

t.setHour返回的參考 - 類似於上面我們tAgain。只是t本身的別名。

+1

不,他們返回的價值,而不是參考。 – juanchopanza

+0

@juanchopanza:怎麼樣? –

+0

它在聲明中:'Time setHour(int);'通過值返回'Time'。 – juanchopanza