• C++函数重载完全攻略(无师自通)

    有时候需要创建两个或多个执行相同操作的函数,但使用不同的形参集或不同数据类型的形参。

    例如,有一个使用 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 of\n";
        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

更多...

加载中...