通过价值并通过参考传递

时间:2015-03-19 23:41:55

标签: c++ pass-by-reference pass-by-value

我正在开发一个项目,通过使用重载计算员工的收入,并通过值传递+通过引用传递。我需要使用程序中的至少一个函数来演示pass-by-value;以及至少一个用参考参数演示pass-by-reference的函数。这是我到目前为止所得到的:

#include <iostream>
#include "Grosspay.h"
#include "iomanip"
using namespace std;

double income(double hours, double payrate)
{
    double grosspay = 0;
    double federaltax = .10;
    double statetax = .05;
    double totaltax;
    double netpay;
    if (hours <= 40)
    {
        grosspay = payrate * hours;
    }if (hours > 40 && hours <= 50)
    {
        grosspay = (payrate * 40) + ((hours - 40) * payrate * 1.5);
    }
    if (hours > 50)
    {
        grosspay = (payrate * 40) + (10 * payrate * 1.5) + ((hours - 50) * payrate * 2);
    }
    cout << "Grosspay weekly is: " << grosspay << endl;

    federaltax = grosspay * .10;
    cout << "Federal Tax is: " << federaltax << endl;

    statetax = grosspay * .05;
    cout << "State Tax is: " << statetax << endl;

    totaltax = federaltax + statetax;
    cout << "Total tax is: " << totaltax << endl;

    netpay = grosspay - totaltax;
    return (netpay);

}
double income(const double &year)
{
    double grosspay;
    double federaltax = .10;
    double statetax = .05;
    double totaltax;
    double netpay;

    grosspay = year / 52;
    cout << "Grosspay weekly is: " << grosspay << endl;

    federaltax = grosspay * .10;
    cout << "Federal Tax is: " << federaltax << endl;

    statetax = grosspay * .05;
    cout << "State Tax is: " << statetax << endl;

    totaltax = federaltax + statetax;
    cout << "Total Tax is: " << totaltax << endl;

    netpay = grosspay - totaltax;
    return (netpay);
}

void Grosspay::determineGrosspay()
{
    cout << "Enter 1 - Calculate payroll for hourly employee" << endl;
    cout << "Enter 2 - Calculate payroll for salary employee" << endl;
    cout << "Enter 3 - Exit" << endl;

    cout << "Federal Tax is 10% of Grosspay" << endl;
    cout << "State Tax is 5% of Grosspay" << endl;
    while (choice != 3)
    {
        cout << "\nEnter your choice: " << endl;
        cin >> choice;
        switch (choice)
        {
        case 1:
            cout << "Enter employee ID: " << endl;
            cin >> ID;
            cout << "Enter hours: " << endl;
            cin >> hours;
            cout << "Enter payrate: " << endl;
            cin >> payrate;

            cout << "Employee ID: " << ID << endl;
            cout << setprecision(2) << fixed;
            cout << "The net pay for hourly employee: " << income(hours, payrate) << endl;
            break;
        case 2:
            cout << "Enter employee ID: " << endl;
            cin >> ID;
            cout << "Enter salary: " << endl;
            cin >> year;

            cout << "Employee ID: " << ID << endl;
            cout << setprecision(2) << fixed;
            cout << "The net pay for salaried employee: " << income(year) << endl;
            break;
        case 3:
            cout << "Exited program" << endl;
            break;
        default:
            cout << "Please try again!" << endl;
            break;
        }
    }
}

这里的一位天才告诉我,我需要将double income(const double &year)用于传递参考。但我不确定是什么造成了不同!我仍然有相同的输出。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:4)

以下是一些指导原则:

  • 如果值可以适合处理器的寄存器,则传递值 该参数不会被修改。
  • 如果参数将被函数修改,则按引用传递。
  • 如果对象大于,则通过常量引用 处理器的寄存器和参数不会被修改。

通过double, float, int, char,bool等类型的常量引用传递没有意义,因为它们通常适合处理器的字大小。编译器将尝试在寄存器中传递这些值。 这些POD类型没有额外的复制成本。因此,按值传递(需要更少的输入)。

答案 1 :(得分:1)

在函数签名中编写&符号时,您指定接受对参数的引用(在call语句中)。在您的函数double income(const double &year)中,您通过引用传递,因为year是对year的引用。

传递值时,会创建参数的副本。当您通过引用传递时,不会创建副本,并且您的变量现在具有参数的地址。因此,如果您对函数中的year进行了更改(假设它不是用于演示目的的const),则determineGross中的值也将更改,因为该地址的值已更改。 / p>