Passing Data - by ReferencePassing Data - by Reference
Syntax
double Pythagorus(double &&, double &&);
Pythagorus(height, base);
double Pythagorus(double& & a, double& & b)
function prototype
function call
function definition
Addressoperator
double Pythagorus(double &&, double &&);void main(void){ double height = 4.0, base = 3.0;
cout << “Hypotenuse = “ << Pythagorus(height, base) << endl;. . .
}
double Pythagorus(double& & a, double& & b){ double c;
c = sqrt(a*a + b*b);return c;
}
Passing Data by-reference ExamplePassing Data by-reference Example
* *
addressaddress of heightof height
address address of baseof base
5.0
c
double Pythagorus(double& & a, double& & b){ double c;
a++;b++;
c = sqrt(a*a + b*b);return c;
}
Passing Data - by ReferencePassing Data - by Reference
* * * * *
addressaddress of heightof height
address address of baseof base
back in main: cout << height;cout << base:
4.0 3.0
c
5.0 4.0
6.4
6.4
5.04.0
height base
Passing Data - by ReferencePassing Data - by Reference
In main() valuesreferenced as
1 value stored1 value stored
a
height
1 value stored1 value stored
b
base
In Pythagorus()values referenced as
*
By-Reference, Another ExampleBy-Reference, Another Example{
float a, b, c, sum, product;void calc(float, float, float, float &, float &); // prototype
cout << "Enter three numbers: ";cin >> a >> b >> c;
calc(a, b, c, sum, product); // callcout << a<<“ + “<<b<<“ + “c<<“ = " << sum;cout << ‘\n’<<a<<“ * “<<b<<“ * “c<<“ = " << product;
}
void calc(float x, float y, float z, float &tot, float& multiply){ tot = x + y + z; // definition
multiply = x * y * z;x++; y++; z--; // for demo purposes
}
Another Example: What happens?Another Example: What happens?
calc(a, b, c, sum, product);
void calc(float x, float y, float z,float &tot, float& multiply){ tot = x + y + z;
multiply = x * y * z;x++; y++; z--;
}
5 7 9 ? ?a b c sum product
5 7 9 sum product
21 315
6 8 8
Another Example: Program OutputAnother Example: Program Output
OutputEnter three numbers: 5 7 95 + 7 + 9 = 215 * 7 * 9 = 315
*
x is 6, y is 8, z is 8tot and sum refer to the same addressproduct and multiply refer to the same address
Passing Data - by ReferencePassing Data - by Referencevoid main(void){ int w = 3;
void print_val(int &); // local function prototype
cout <<"w before the function call is "<<w<<‘\n’; print_val(w);
cout <<"w after the function call is "<<w<<‘\n’;}
void print_val(int& q){ cout<<"Value passed to the function is "<<q<<endl;
q = q *2; // doubles the value of w?cout<<"Value at the end of the function is "<< q <<endl;
}
Passing Data - by ReferencePassing Data - by Reference
Output w before the function call 3
Value passed to the function is 3
Value at the end of the function is 6
w after the function call is 6
void print_val (int &q);
This function doubles the value of any (int) variable sent to it (not just w).
Swap RoutineSwap Routine
void swap(float& num1, float& num2){
float temp;
temp = num1;num1 = num2;num2 = temp;
}
What happens if we use call by-
value for the swap function?
Data Type MismatchData Type Mismatchvalue parameters
implicit type conversion - value of the actual parameter is coerced to the data type of the formal parameter
reference parameterscoercion not possible because an address is passed, not a value- types must match
* *
A ComparisonA Comparison
formal actualparameter is parameter may be
value variable, constant, or expression
type coercion may take place
reference variable onlyof exact same type as formal
What’s Happening????What’s Happening????call sequence
1. memory is allocated 2. parameters are passed3. transfer of control
return sequence
1. value of the return is stored 2. memory is deallocated3. transfer of control
* *