Apr 24, 2017 at 7:07pm Apr 24, 2017 at 7:07pm UTC
This is an example out of my book. I am trying to understand why the constructor for CommissionEmployee uses references. In the past, I have used references to change values of preexisting variables, but these variables do not exist before the constructor executes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
// Fig. 11.4: CommissionEmployee.h
// CommissionEmployee class definition represents a commission employee.
#ifndef COMMISSION_H
#define COMMISSION_H
#include <string> // C++ standard string class
class CommissionEmployee {
public :
CommissionEmployee(const std::string&, const std::string&,
const std::string&, double = 0.0, double = 0.0);
void setFirstName(const std::string&); // set first name
std::string getFirstName() const ; // return first name
void setLastName(const std::string&); // set last name
std::string getLastName() const ; // return last name
void setSocialSecurityNumber(const std::string&); // set SSN
std::string getSocialSecurityNumber() const ; // return SSN
void setGrossSales(double ); // set gross sales amount
double getGrossSales() const ; // return gross sales amount
void setCommissionRate(double ); // set commission rate (percentage)
double getCommissionRate() const ; // return commission rate
double earnings() const ; // calculate earnings
std::string toString() const ; // create string representation
private :
std::string firstName;
std::string lastName;
std::string socialSecurityNumber;
double grossSales; // gross weekly sales
double commissionRate; // commission percentage
};
#endif
// ///////////////////////////////////////////////////////////////////////////////////////////
// Fig. 11.5: CommissionEmployee.cpp
// Class CommissionEmployee member-function definitions.
#include <iomanip>
#include <stdexcept>
#include <sstream>
#include "CommissionEmployee.h" // CommissionEmployee class definition
using namespace std;
// constructor
CommissionEmployee::CommissionEmployee(const string& first,
const string& last, const string& ssn, double sales, double rate) {
firstName = first; // should validate
lastName = last; // should validate
socialSecurityNumber = ssn; // should validate
setGrossSales(sales); // validate and store gross sales
setCommissionRate(rate); // validate and store commission rate
}
// set first name
void CommissionEmployee::setFirstName(const string& first) {
firstName = first; // should validate
}
// return first name
string CommissionEmployee::getFirstName() const { return firstName; }
// set last name
void CommissionEmployee::setLastName(const string& last) {
lastName = last; // should validate
}
// return last name
string CommissionEmployee::getLastName() const { return lastName; }
// set social security number
void CommissionEmployee::setSocialSecurityNumber(const string& ssn) {
socialSecurityNumber = ssn; // should validate
}
// return social security number
string CommissionEmployee::getSocialSecurityNumber() const {
return socialSecurityNumber;
}
// set gross sales amount
void CommissionEmployee::setGrossSales(double sales) {
if (sales < 0.0) {
throw invalid_argument("Gross sales must be >= 0.0" );
}
grossSales = sales;
}
// return gross sales amount
double CommissionEmployee::getGrossSales() const { return grossSales; }
// set commission rate
void CommissionEmployee::setCommissionRate(double rate) {
if (rate <= 0.0 || rate >= 1.0) {
throw invalid_argument("Commission rate must be > 0.0 and < 1.0" );
}
commissionRate = rate;
}
// return commission rate
double CommissionEmployee::getCommissionRate() const {
return commissionRate;
}
// calculate earnings
double CommissionEmployee::earnings() const {
return commissionRate * grossSales;
}
// return string representation of CommissionEmployee object
string CommissionEmployee::toString() const {
ostringstream output;
output << fixed << setprecision(2); // two digits of precision
output << "commission employee: " << firstName << " " << lastName
<< "\nsocial security number: " << socialSecurityNumber
<< "\ngross sales: " << grossSales
<< "\ncommission rate: " << commissionRate;
return output.str();
}
// ////////////////////////////////////////////////////////////////////////////////////////////////
// Fig. 11.6: fig11_06.cpp
// CommissionEmployee class test program.
#include <iostream>
#include <iomanip>
#include "CommissionEmployee.h" // CommissionEmployee class definition
using namespace std;
int main() {
// instantiate a CommissionEmployee object
CommissionEmployee employee{"Sue" , "Jones" , "222-22-2222" , 10000, .06};
// get commission employee data
cout << fixed << setprecision(2); // set floating-point formatting
cout << "Employee information obtained by get functions: \n"
<< "\nFirst name is " << employee.getFirstName()
<< "\nLast name is " << employee.getLastName()
<< "\nSocial security number is "
<< employee.getSocialSecurityNumber()
<< "\nGross sales is " << employee.getGrossSales()
<< "\nCommission rate is " << employee.getCommissionRate() << endl;
employee.setGrossSales(8000); // set gross sales
employee.setCommissionRate(.1); // set commission rate
cout << "\nUpdated employee information from function toString: \n\n"
<< employee.toString();
// display the employee's earnings
cout << "\n\nEmployee's earnings: $" << employee.earnings() << endl;
}
Last edited on Apr 24, 2017 at 7:08pm Apr 24, 2017 at 7:08pm UTC
Apr 24, 2017 at 7:39pm Apr 24, 2017 at 7:39pm UTC
first of all, when we pass argument to function or constructor, the compiler make a copy then initialize the parameter by this copy
so we usually use references to avoid coping The large objects (e.g string , vector , list and etc) and some classes can't be copied like streams (e.g istream , ostream) , in this case we must make it reference.
so i think he used const reference to avoid coping in addition he used const qualifier to refer that it can't be changed.
and you can use reference parameter to return additional value than one value (pass by ref) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int foo(int & i)
{
int j = 0;
// do something
i = 42; // we change i value as returned value
return j; // here we returned the first value
}
int main()
{
int val = 0 , val2 = 0;
val = foo(val2); // now we returned two values from the function : val = j , val2 = i
}
Last edited on Apr 24, 2017 at 7:46pm Apr 24, 2017 at 7:46pm UTC
Apr 24, 2017 at 7:46pm Apr 24, 2017 at 7:46pm UTC
heh
I was just reading about refernce arguments! :D
passing as reference is actual memory address for starter.
besides that function can access actual variables in the calling program. Another benefits, this provides a mechanism for passing more than one value from function back to the calling program.
Object Orientated Programming in C++ 4th Edition page 182 chapter 5
Last edited on Apr 24, 2017 at 7:47pm Apr 24, 2017 at 7:47pm UTC