C++函數過載完全攻略(無師自通)

2020-07-16 10:04:35
有時候需要建立兩個或多個執行相同操作的函數,但使用不同的形參集或不同資料型別的形參。

例如,有一個使用 double 形參的 square 函數。但是我們還需要一個 square 函數,該函數專門用於整數,並接收一個 int 作為其實參。這兩個函數都會做同樣的事情:返回其實參的平方值,唯一的區別是參與操作的資料型別。如果在同一程式中使用這兩個函數,則可以為每個函數分配唯一的名稱。例如,對於使用 int 的函數可以命名為 squarelnt,對於使用 double 的函數可以命名為 squareDouble。

但是,C++ 允許函數過載,這意味著可以為多個函數分配相同的名稱,只要它們的形參列表不同即可。下面的程式演示了該功能:
#include <iostream>
#include <iomanip>
using namespace std;

// Function prototypes
int square(int);
double square(double);

int main()
{
    int userInt;
    double userReal;
    // Get an int and a double
    cout << "Enter an integer and a floating-point value: ";
    cin >> userInt >> userReal;
   
    // Display their squares
    cout << "Here are their squares:";
    cout << fixed << showpoint << setprecision(2);
    cout << square(userInt) << " and " << square(userReal) << endl;
    return 0;
}

int square (int number)
{
    return number * number;
}

double square(double number)
{
    return number * number;
}
程式輸出結果:

Enter an integer and a floating-point value: 12 4.2
Here are their squares: 144 and 17.64

以下是程式中使用的 square 函數的函數頭:

int square(int number)
double square(double number)

在 C++ 中,每個函數都有一個簽名。函數簽名是函數的名稱和函數形參的資料型別順序。因此,上面程式中的 square 函數具有以下簽名:

square(int)
square(double)

當呼叫過載函數時,C++ 將使用函數簽名將其與具有相同名稱的其他函數區分開來。在上面程式中,當 int 實參被傳遞給 square 時,呼叫具有 int 形參的函數版本。同樣,當 double 實參被傳遞給 square 時,將呼叫帶有 double 形參的版本。

請注意,函數的返回值不是簽名的一部分。以下函數無法在同一程式中使用,因為它們的形參列表並無差異。
int square(int number)
{
    return number * number;
}
double square (int number) //錯誤!形參列表必須不同
{
    return number * number;
}
當有類似函數使用不同數量的形參時,過載也很方便。例如,假設有一個程式包含的函數可以返回整數和。其中一個函數返回 2 個整數的和,另一個返回 3 個整數的和,還有一個返回 4 個整數的和。以下是它們的函數頭:

int sum(int num1, int num2)
int sum(int num1, int num2, int num3)
int sum(int num1, int num2, int num3, int num4)

由於每個函數的形引數量不同,所以它們可以在同一個程式中使用。下面程式使用了 2 個函數,每一個都被命名為 CalcWeeklyPay,以確定員工的每周總收入。一個版本的函數使用一個 int 和一個 double 形參,而另一個版本則僅使用一個 double 形參。
#include <iostream>
#include <iomanip>
using namespace std;

//Function prototypes
char getChoice ();
double calcWeeklyPay(int, double);
double calcWeeklyPay(double);

int main()
{
    char selection; // Menu selection
    int worked; // Weekly hours worked
    double rate,    // Hourly pay rate
    yearly; // Annual salary
   
    // Set numeric output formatting
    cout << fixed << showpoint << setprecision(2);

    //Display the menu and get a selection
    cout << "Do you want to calculate the weekly pay ofn";
    cout << "(H) an hourly-wage employee, or n";
    cout << "(S) a salaried employee? ";
    selection = getChoice ();
    // Process the menu selection
    switch (selection)
    {
        //Hourly employee
        case 'H':
        case 'h':
            cout << "How many hours were worked? ";
            cin >> worked;
            cout << "What is the hourly pay rate? ";
            cin >> rate;
            cout << "The gross weekly pay is $";
            cout << calcWeeklyPay(worked, rate) << endl;
            break;
        //Salaried employee
        case 'S' :
        case 's' :
            cout << "What is the annual salary? ";
            cin >> yearly;
            cout << "The gross weekly pay is $";
            cout << calcWeeklyPay(yearly) << endl;
    }
    return 0;
}
char getChoice()
{
    char letter; // Holds user1s letter choice
    // Get the user's choice
    cin >> letter;
    // Validate the choice
    while (letter != 'H' && letter != 'h' && letter != 'S' && letter != 's')
    {
        cout << "Enter H or S:";
        cin >> letter;
    }
    // Return the choice
    return letter;
}
double calcWeeklyPay(int hours, double payRate)
{
    return hours * payRate;
}
double calcWeeklyPay(double annSalary)
{
    return annSalary / 52.0;
}
程式輸出結果:

Do you want to calculate the weekly pay of
(H) an hourly-wage employee, or
(S) a salaried employee? H
How many hours were worked? 40
What is the hourly pay rate? 18.50
The gross weekly pay is $740.00