140 likes | 155 Views
Learn how to pass data by reference in C++, including syntax, examples, and the difference between passing by reference and by value. Explore the concepts through code examples and explanations.
E N D
Addressoperator Passing Data - by Reference • Syntax • double Pythagorus(double &, double &); • Pythagorus(height, base); • double Pythagorus(double& a,double& b) function prototype function call function definition
address of base addressof height c 5.0 Passing Data by-reference Example • 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; • } * *
6.4 Passing Data - by Reference base height 4.0 3.0 • double Pythagorus(double& a, double& b) • { double c; • a++; • b++; • c = sqrt(a*a + b*b); • return c; • } 5.0 4.0 address of base addressof height c 6.4 back in main: cout << height; cout << base: 5.04.0 * * * * *
height base 1 value stored 1 value stored a b Passing Data - by Reference • In main() valuesreferenced as In Pythagorus()values referenced as *
By-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); // call • cout << 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 • }
a c b sum product 7 9 5 ? ? 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--; • } 21 315 8 8 6 7 5 9 sum product
Another Example: Program Output • Output Enter three numbers: 5 7 9 5 + 7 + 9 = 21 5 * 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 Reference • void 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 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 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 Mismatch • value parametersimplicit 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 Comparison • formal actual • parameter is parameter may be • value variable, constant, or expression type coercion may take place • reference variable only • of exact same type as formal
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 deallocated 3. transfer of control * *