C++ 純函數(shù)

2023-03-20 15:58 更新

如果一個(gè)函數(shù)的返回結(jié)果只取決于參數(shù)值,并且沒(méi)有像修改參數(shù)、輸出一些值等副作用,那么就可認(rèn)為此函數(shù)是純函數(shù)。

下面這個(gè)after函數(shù)就是一例。此函數(shù)比較兩個(gè)Time變量并返回一個(gè)布爾值并指出第一個(gè)操作數(shù)是否比第二個(gè)晚:

bool after (Time& time1, Time& time2) {
    if (time1.hour > time2.hour) return true;
    if (time1.hour < time2.hour) return false;
    if (time1.minute > time2.minute) return true;
    if (time1.minute < time2.minute) return false;
    if (time1.second > time2.second) return true;
    return false;
}

當(dāng)兩個(gè)時(shí)間相等時(shí),函數(shù)返回什么?函數(shù)是否有適當(dāng)?shù)姆祷刂担咳绻悄銥榇撕瘮?shù)編寫(xiě)文檔,你會(huì)專(zhuān)門(mén)提及這種情況嗎?

另外一例是addTime函數(shù),負(fù)責(zé)計(jì)算兩個(gè)時(shí)間值之和。比如現(xiàn)在是9:14:30,你的面包機(jī)工作時(shí)間是3小時(shí)35分鐘,你可以使用addTime函數(shù)來(lái)計(jì)算什么時(shí)候面包做好。

下面是此函數(shù)的一個(gè)草稿,不一定完全正確:

Time addTime (Time& t1, Time& t2) {
    Time sum;
    sum.hour = t1.hour + t2.hour;
    sum.minute = t1.minute + t2.minute;
    sum.second = t1.second + t2.second;
    return sum;
}

下面舉一個(gè)使用該函數(shù)的例子。若currentTime為當(dāng)前時(shí)間,breadTime為面包機(jī)做面包用的總時(shí)間,你就可以用addTime計(jì)算面包做好的時(shí)間了。

Time currentTime = { 9, 14, 30.0 };
Time breadTime = { 3, 35, 0.0 };
Time doneTime = addTime (currentTime, breadTime);
printTime (doneTime);

這段程序的輸出為12:49:30,答案正確。另外,還有些例子的結(jié)果是不正確的。你能想出一個(gè)嗎?

這個(gè)函數(shù)的問(wèn)題在于它沒(méi)有處理秒數(shù)或分鐘數(shù)加起來(lái)超過(guò)60的情況。這種情況我們必須將多出的秒數(shù)“進(jìn)位”到分鐘,或者多出的分鐘進(jìn)位到小時(shí)。

下面是再次修改函數(shù)后的正確版本:

Time addTime (Time& t1, Time& t2) {
    Time sum;
    sum.hour = t1.hour + t2.hour;
    sum.minute = t1.minute + t2.minute;
    sum.second = t1.second + t2.second;
    if (sum.second >= 60.0) {
        sum.second -= 60.0;
        sum.minute += 1;
    }
    if (sum.minute >= 60) {
        sum.minute -= 60;
        sum.hour += 1;
    }
    return sum;
}

代碼正確了,但也變長(zhǎng)了。稍后,我將給出另一個(gè)解決方案,能大大簡(jiǎn)短代碼。

這段代碼給出了我們之前沒(méi)見(jiàn)過(guò)的兩個(gè)操作符:+=和-=,用于簡(jiǎn)潔的表示變量的增減。比方說(shuō),語(yǔ)句

sum.second -= 60.0;

和語(yǔ)句

sum.second = sum.second - 60;

是等價(jià)的。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)