120 likes | 128 Views
Learn about returning multiple values from a function and using reference parameters to modify arguments in the caller function. Understand the underlying mechanisms and examples of swapping values and counting occurrences.
E N D
Reference parameters (6.2.3) • We might need a function to return more than one value • Find roots of a quadratic • 2 return values. What are they? • Get first and last name of a userand return them • 2 return values • Functions are limited to one return value using return • When you need to return several values back from a function • Use reference parameters • The idea is that when the value of the parameter is modified,function modifies the value of the corresponding argument as well
Value Parameters - Pass by value • The parameters we have seen so far are value parameters • their arguments are passed by value • if you change the value of a parameter in function, corresponding argument does NOT change in the caller function • Example: see passbyvalue.cpp (not in book) • parameter a changes in function average, but corresponding argument, num1, does not change in main Enter two integers: 10 15 in main before calling average: num1 = 10, num2 = 15 beginning of function average: a = 10, b = 15 end of function average: a = 25, b = 15 average is 12.5 in main after calling average: num1 = 10, num2 = 15
Reference Parameters – Pass by Reference • Reference parameters are used to change the value of the argument in the caller function as well • ampersand (&) between type and name void myfunction (int & num) • if you change the value of a reference parameter in function, corresponding argument changes in the caller function • Argument of a reference parameter must be a variable • This is a reasonablerule, becauseotherwise its value won’t change • See passbyreference.cpp (not in book) • parameter a changes in function average; corresponding argument, num1, changes in main as well Enter two integers: 10 15 in main before calling average: num1 = 10, num2 = 15 beginning of function average: a = 10, b = 15 end of function average: a = 25, b = 15 average is 12.5 in main after calling average: num1 = 25, num2 = 15
Underlying Mechanisms • For value parameters, the arguments’ values are copied into parameters • arguments and parameters have different memory locations double average (int a, int b) average(num1, num2) 10 15 copy value copy value main function 10 15
Underlying Mechanisms • For reference parameters, the parameter and the argument share the same memory location • parameter is an alias of argument double average (int & a, int b) average(num1, num2) 15 refers to the same memory location copy value main function 10 15
Example: Swap • Write a function that swaps the values of its two integer parameters void swap(int & a, int & b) { int temp; temp = a; a = b; b = temp; } • How do we use this in main? int a=5, b=8; swap(a,b); // a becomes 8, b becomes 5 swap(a,5); // syntax error, arguments must be variables
Examples • What’s prototype for a void function that takes a stringas parameter and returns the number of vowels and consonants in it? void letters(string s, int & vowels, int & consonants); • What’s prototype for a void function that returns the number of hours, minutesin N seconds. Where N is a parameter? void TimeConversion(int N, int & hours, int & minutes);
Reference Parameters are not only to return multiple values • Even if you have a single value to return, you may prefer to return it as a reference parameter, not as the return value of the function. • ToLowerfunction,defined instrutils, changes its argument to all lowercase. It is actually avoid function, i.e. does not return anything as the function’s return value • Prototype is void ToLower(string & s); • Example use string s = "HeLLo"; ToLower(s); // s becomes “hello”
Example (See roots.cpp) • Roots of a quadratic equation ax2 + bx + c = 0 • what could be a prototype? void roots(double a, double b, double c, double & r1, double &r2); • What happens if • one root? • no roots? • how will you inform the caller function about the number of roots? • necessary in order to let the caller function to interpret arguments for r1 and r2 • Solution: let the function return (as the return value) an integer value for the number of roots • So, the prototype becomes int roots(double a, double b, double c, double & r1, double & r2);
Parameter Passing: const-reference • Pass by value (value parameters) has overheads • copying the value • memory allocation for both parameter and argument • Sometimes we want to avoid the overhead of making the copy, but we don’t want to allow the argument to be changed. • const-reference parameters avoid copies, but cannot be changed in the function • trying to change a const-reference parameter is a syntax error • defined with const before a reference parameter void demo (const int & num, const string & s);
Example • Count number of occurrences of a letter in a string • Write a function for it • Look at every character in the string intLetterCount(conststring& s, conststring&letter) // post: return number of occurrences of letter in s { int k, count = 0, len = s.length(); for(k=0; k < len; k++) { if (s.substr(k,1) == letter) { count++; } } return count; } • Calls below are legal int ec = LetterCount("elephant", "e"); string s = "hello"; cout << LetterCount(s, "a");
General rules for Parameters • Const-reference parameters allow constants and literals to be passed • For example, “elephant” cannot be passed asan argumentfor a referenceparameter, but it is ok with const-reference • Somegood-programmingtips • Built-in types (int, double, bool, char) - pass by value unless youchange it andreturnfromthe function • All other types - pass by const-reference unless youchange it andreturnfromthe function • When you change and want to return the changed value, use reference parameters • What about using classes as the parameter type? • use reference parameters if you are changing the state of the parameter object • that is why we used reference parameters for Robot objects • use const reference if you are not changing the state of the parameter object