1 / 12

Reference parameters (6.2.3)

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.

wreagan
Download Presentation

Reference parameters (6.2.3)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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);

  8. 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”

  9. 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);

  10. 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);

  11. 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");

  12. 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

More Related