C++私有成員函數

2020-07-16 10:04:40
到目前為止,我們所看到的所有類成員函數都是公共函數,這意味著它們可以通過類外部的程式程式碼呼叫。但是,類也經常需要一些函數來進行內部處理,這樣的函數不應該由類外的程式碼呼叫,它們應該被宣告為私有

下面的程式顯示了具有私有函數的類的範例。SimpleStat 類被設計用於從傳送給它的一組非負整數中查詢和報告資訊,如平均值和最大數位。但是,一旦某個數位已經被接收並被新增到累計匯總,那麼它將不被保留,所以該類不能等以後再確定哪個數位是最大的,它必須通過檢查其讀取的每個數位來檢視它是否大於之前讀取的任何數位。isNewLargest 私有函數正是執行此操作的。
#include <iostream>
using namespace std;
class SimpleStat
{
    private:
        int largest;    // The largest number received so far
        int sum;    // The sum of the numbers received
        int count;    // How many numbers have been received
        bool isNewLargest(int); // This is a private class function

    public:
        SimpleStat();    // Default constructor
        bool addNumber(int);
        double getAverage();
   
    int getLargest()
    {
        return largest;
    }
    int getCount()
    {
        return count;
    }
};
SimpleStat::SimpleStat()
{
    largest = sum = count = 0;
}

bool SimpleStat::addNumber(int    num)
{
    bool goodNum = true;
    if (num >= 0)    // If num is valid
    {
        sum += num;    // Add it to the sum
        count++;    // Count it
        if(isNewLargest(num))    // Find out if it is
        largest = num;    // the new largest
    }
    else    //num is invalid
        goodNum = false;
    return goodNum;
}
bool SimpleStat::isNewLargest(int num)
{
    if (num > largest)
        return true;
    else
        return false;
}
double SimpleStat::getAverage()
{
    if (count > 0)
        return static_cast<double>(sum) / count;
    else
        return 0;
}
//Client Program
int main()
{
    int num;
    SimpleStat statHelper;

    cin >> num;
    while (num >= 0)
    {
        statHelper.addNumber(num);
        cin >> num;
    }
    cout << "nYou entered "<< statHelper.getCount() << " values. n";
    cout << "The largest value was " << statHelper.getLargest () << endl;
    cout << "The average value was " << statHelper.getAverage () << endl;
    return 0;
}
程式輸出結果:

7 6 8 8 9 7 7 -1

You entered 7 values.
The largest value was 9
The average value was 7.42857

程式中,私有函數 isNewLargest 的編寫目的是建立一個更模組化的類,使程式碼更易懂。雖然程式沒有這個函數也可以正常編寫完成,但是,在那種情況下,addNumber 函數本身將不得不處理比較新值與 largest 的額外工作。