2015-03-19 3 views
2

Я работаю над проектом, который рассчитывает доход для сотрудников, используя перегрузку, а также передает значение + пройти по ссылке. Мне нужно использовать хотя бы одну из функций в программе, чтобы продемонстрировать пропускную способность; и, по меньшей мере, одну из функций для демонстрации сквозных ссылок с помощью ссылочных аргументов. Вот то, что я до сих пор:Пройти по значению и пройти по ссылке

#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) для прохода по ссылке. Но я не совсем уверен, какая разница! У меня все тот же результат. Кто-нибудь может мне помочь, пожалуйста!

+0

Если вы отделите вычисления от выходного сигнала, параметры ссылки начнут иметь больше смысла. – molbdnilo

ответ

3

Вот некоторые рекомендации:

  • Пасс значение, если значение помещается в регистры процессора и параметр не будет изменен.
  • Передайте по ссылке, если параметр будет изменен функцией.
  • Передайте постоянную ссылку, если объект больше регистра процессора , и этот параметр не будет изменен.

Передача постоянной ссылки на типы, как double, float, int, char, и bool не имеет смысла, потому что они, как правило, укладываются в размер слова процессора. Компилятор попытается передать эти значения в регистр. Эти типы POD не имеют дополнительных затрат на копирование. Таким образом, перейдите по значению (требуется меньше ввода).

+0

Я новичок, поэтому не совсем понимаю, что вы говорите. Что мне нужно сделать в моем коде, чтобы исправить это? –

+0

Вам не нужно его исправлять. Альтернативой является использование «двойного дохода (двойной год)». –

+0

Теперь я полностью потерялся. Таким образом, этот «двойной доход (двойные часы, двойной уплату)» является передачей по значению, а «двойной доход (const double & year)» является передачей по ссылке. Но не будет никаких изменений, если я получу двойной доход (двойной год). Это то, что, как я думаю, я понял из своих знаний. Затем, как сделать 'const' и' double & year' сделать, чтобы стать ссылочным параметром? –

1

Когда вы пишете амперсанд в сигнатуре функции, вы указываете, что принимаете ссылку на аргумент (в операторе вызова). В вашей функции double income(const double &year) вы проходите мимо ссылки, потому что год является ссылкой на year.

Когда вы проходите по значению, создается копия аргумента. Когда вы проходите по ссылке, копия не создается, и ваша переменная теперь имеет адрес аргумента. Поэтому, если вы вносите изменения в year в функцию (при условии, что это не const для демонстрационных целей), ваше значение в determineGross также будет изменено, так как значение по этому адресу было изменено.

+0

Я понимаю первый абзац, который вы упомянули.Итак, что означает «двойной доход (двойные часы, двойной уплату)», становится параметром значения? –

+0

То, что вы не приводите имя переменной с амперсандом. Это очень высокий уровень мышления. – peter