3/16/2009 For Next Time Read Chapter 10 More on Functions Chapter 10 1 2 Global Variables Prefer Locals Space for local variables occupied only when Local variables: declared within functions the function is executing “Local” to that function Local variables in one function are completely Scope is limited to function independent of local variables in another function (they cannot interact or influence each Names do not conflict with any other variables other across function boundaries) Global variables: declared outside any function Local variables “start fresh” each time the “Global” to the file and/or program function is called Scope is entire file and/or program A function that uses no global variables can be Declared static : scope limited to file used as is in other programs 3 4 Locals Hide Globals Locals vs. Globals If a local variable has the same name as a Locals are uninitialized global variable, the local variable is the one Globals are automatically initialized to used within the function “zero” To access the like-named global, use the scope Numbers are 0 resolution operator, :: Booleans are false ::x Other types (to be seen) are “zero -ish ” The compiler resolves names as follows If it is declared locally, it’s local If it is not declared within the function, it checks for global declaration If it is not local and it is not global, it is undefined 5 6 1
3/16/2009 Static Locals Static Globals If a local variable is qualified as static , it lives If a global variable is qualified as static , its between function invocations scope is limited to the file in which it is declared The static qualifier renders a variable “file Its value is retained between function calls local” Space for static locals is allocated when the Functions can also be declared static program begins executing and is deallocated when the program terminates Such functions cannot be used outside of the file in which they are declared 7 8 Function Signature Function Overloading A function’s signature consists of its name and C++ allows definition of multiple functions with types of parameters the same name A function’s signature can be determined from Two functions within the same program that its prototype and/or its definition have the same name are said to be overloaded void f(int x, double y) { … } Examples: void f(int, double); void f(int x, double y) { … } A function’s return type is not included in a void f(int ) { … } function’s signature Overloaded functions must have different signatures 9 10 Factorial C++ Recursive Factorial One definition of the mathematical factorial int factorial(int n) function: { if ( n == 0 ) return 1; Another, recursive, definition: else return n * factorial(n – 1); } 11 12 2
3/16/2009 How it Works How it Works factorial(6) = ? factorial(6) = 6 * factorial(5) 13 14 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) 15 16 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) 17 18 3
3/16/2009 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 19 20 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 21 22 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 3 * 2 23 24 4
3/16/2009 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 6 = 6 * 5 * 4 * 6 25 26 How it Works How it Works factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) factorial(6) = 6 * factorial(5) = 6 * 5 * 4 * factorial(3) = 6 * 5 * factorial(4) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 6 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 24 = 6 * 5 * 4 * 6 = 6 * 5 * 24 27 28 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 6 = 6 * 5 * 4 * 6 = 6 * 5 * 24 = 6 * 120 29 30 5
3/16/2009 How it Works How it Works factorial(6) = 6 * factorial(5) factorial(6) = 6 * factorial(5) = 6 * 5 * factorial(4) = 6 * 5 * factorial(4) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * factorial(3) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * factorial(2) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * factorial(1) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * factorial(0) = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 * 1 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 3 * 2 = 6 * 5 * 4 * 6 = 6 * 5 * 4 * 6 = 6 * 120 = 6 * 120 = 720 31 32 Correct Recursion Making Functions Reusable A correct recursive function must Commercial C++ programs often consist of Call itself within its definition hundreds of separate C++ files that are compiled This is the recursive case separately and linked together to make the Provide a way that it does not call itself executable file This is the base case A function defined in one file may be used by code Provide some sort of conditional construct to in many other files select between the recursive and base cases A function must have exactly one definition, in one if/else or switch statement file Each recursive call must move the execution Since each file has to compiled separately, how closer to the base case can we use the same function in multiple files? Otherwise infinite recursion (stack overflow) will result 33 34 Interface vs. Implementation Variables Put the function’s prototype in a .h header file All variables have a int x = 3; #include the header file in all files that use the name function type Define the function in one .cpp file to be linked in 3 value with all the other compiled files The .h header file specifies the function’s location in memory interface The .cpp source file provides the function’s To this point we have not been concerned about the variable’s memory location implementation 35 36 6
Recommend
More recommend