KEMBAR78
Lecture#7 Call by value and reference in c++ | PPT
EC-102 Computer System &
Programming
Lecture #6
Instructor: Jahan Zeb
Department of Computer Engineering (DCE)
College of E&ME
References and Reference Parameters
 Call by value
– Copy of data passed to function
– Changes to copy do not change original
– Prevent unwanted side effects
 Call by reference
– Function can directly access data
– Changes affect original
Reference Parameters
 Reference parameter
– Alias for argument in function call
• Passes parameter by reference
– Use & after data type in prototype
• void myFunction( int &data )
• Read “data is a reference to an int”
– Function call format the same
• However, original can now be changed
1 // Fig. 3.20: fig03_20.cpp
2 // Comparing pass-by-value and pass-by-reference
3 // with references.
4 #include <iostream>
5
6 using std::cout;
7 using std::endl;
8
9 int squareByValue( int ); // function prototype
10 void squareByReference( int & ); // function prototype
11
12 int main()
13 {
14 int x = 2;
15 int z = 4;
16
17 // demonstrate squareByValue
18 cout << "x = " << x << " before squareByValuen";
19 cout << "Value returned by squareByValue: "
20 << squareByValue( x ) << endl;
21 cout << "x = " << x << " after squareByValuen" << endl;
22
Notice the & operator,
indicating pass-by-reference.
23 // demonstrate squareByReference
24 cout << "z = " << z << " before squareByReference" << endl;
25 squareByReference( z );
26 cout << "z = " << z << " after squareByReference" << endl;
27
28 return 0; // indicates successful termination
29 } // end main
30
31 // squareByValue multiplies number by itself, stores the
32 // result in number and returns the new value of number
33 int squareByValue( int number )
34 {
35 return number *= number; // caller's argument not modified
36
37 } // end function squareByValue
38
39 // squareByReference multiplies numberRef by itself and
40 // stores the result in the variable to which numberRef
41 // refers in function main
42 void squareByReference( int &numberRef )
43 {
44 numberRef *= numberRef; // caller's argument modified
45
46 } // end function squareByReference
Changes number, but
original parameter (x) is not
modified.
Changes numberRef, an
alias for the original
parameter. Thus, z is
changed.
x = 2 before squareByValue
Value returned by squareByValue: 4
x = 2 after squareByValue
 
z = 4 before squareByReference
z = 16 after squareByReference
References and Reference Parameters
References as aliases to other variables
– Refer to same variable
– Can be used within a function
int count = 1; // declare integer variable count
Int &cRef = count; // create cRef as an alias for count
++cRef; // increment count (using its alias)
 References must be initialized when declared
– Otherwise, compiler error
– Dangling reference
• Reference to undefined variable
1 // Fig. 3.21: fig03_21.cpp
2 // References must be initialized.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 int main()
9 {
10 int x = 3;
11
12 // y refers to (is an alias for) x
13 int &y = x;
14
15 cout << "x = " << x << endl << "y = " << y << endl;
16 y = 7;
17 cout << "x = " << x << endl << "y = " << y << endl;
18
19 return 0; // indicates successful termination
20
21 } // end main
x = 3
y = 3
x = 7
y = 7
y declared as a reference to x.
1 // Fig. 3.22: fig03_22.cpp
2 // References must be initialized.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 int main()
9 {
10 int x = 3;
11 int &y; // Error: y must be initialized
12
13 cout << "x = " << x << endl << "y = " << y << endl;
14 y = 7;
15 cout << "x = " << x << endl << "y = " << y << endl;
16
17 return 0; // indicates successful termination
18
19 } // end main
'y' : references must be initialized
Uninitialized reference –
compiler error.
Default Arguments
 Function call with omitted parameters
– If not enough parameters, rightmost go to their defaults
– Default values
• Can be constants, global variables, or function calls
 Set defaults in function prototype
int myFunction( int x = 1, int y = 2, int z = 3 );
– myFunction(3)
• x = 3, y and z get defaults (rightmost)
– myFunction(3, 5)
• x = 3, y = 5 and z gets default
1 // Fig. 3.23: fig03_23.cpp
2 // Using default arguments.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 // function prototype that specifies default arguments
9 int boxVolume( int length = 1, int width = 1, int height = 1 );
10
11 int main()
12 {
13 // no arguments--use default values for all dimensions
14 cout << "The default box volume is: " << boxVolume();
15
16 // specify length; default width and height
17 cout << "nnThe volume of a box with length 10,n"
18 << "width 1 and height 1 is: " << boxVolume( 10 );
19
20 // specify length and width; default height
21 cout << "nnThe volume of a box with length 10,n"
22 << "width 5 and height 1 is: " << boxVolume( 10, 5 );
23
Set defaults in function
prototype.
Function calls with some
parameters missing – the
rightmost parameters get their
defaults.
24 // specify all arguments
25 cout << "nnThe volume of a box with length 10,n"
26 << "width 5 and height 2 is: " << boxVolume( 10, 5, 2 )
27 << endl;
28
29 return 0; // indicates successful termination
30
31 } // end main
32
33 // function boxVolume calculates the volume of a box
34 int boxVolume( int length, int width, int height )
35 {
36 return length * width * height;
37
38 } // end function boxVolume
The default box volume is: 1
 
The volume of a box with length 10,
width 1 and height 1 is: 10
 
The volume of a box with length 10,
width 5 and height 1 is: 50
 
The volume of a box with length 10,
width 5 and height 2 is: 100
Unary Scope Resolution Operator
 Unary scope resolution operator (::)
– Access global variable if local variable has same name
– Not needed if names are different
– Use ::variable
• y = ::x + 3;
– Good to avoid using same names for locals and globals
Function Overloading
 Function overloading
– Functions with same name and different parameters
– Should perform similar tasks
• I.e., function to square ints and function to square floats
int square( int x) {return x * x;}
float square(float x) { return x * x; }
 Overloaded functions distinguished by signature
– Based on name and parameter types (order matters)
– Name mangling
• Encodes function identifier with parameters
– Type-safe linkage
• Ensures proper overloaded function called
1 // Fig. 3.25: fig03_25.cpp
2 // Using overloaded functions.
3 #include <iostream>
4
5 using std::cout;
6 using std::endl;
7
8 // function square for int values
9 int square( int x )
10 {
11 cout << "Called square with int argument: " << x << endl;
12 return x * x;
13
14 } // end int version of function square
15
16 // function square for double values
17 double square( double y )
18 {
19 cout << "Called square with double argument: " << y << endl;
20 return y * y;
21
22 } // end double version of function square
23
Overloaded functions have
the same name, but the
different parameters
distinguish them.
24 int main()
25 {
26 int intResult = square( 7 ); // calls int version
27 double doubleResult = square( 7.5 ); // calls double version
28
29 cout << "nThe square of integer 7 is " << intResult
30 << "nThe square of double 7.5 is " << doubleResult
31 << endl;
32
33 return 0; // indicates successful termination
34
35 } // end main
Called square with int argument: 7
Called square with double argument: 7.5
 
The square of integer 7 is 49
The square of double 7.5 is 56.25
The proper function is called
based upon the argument
(int or double).

Lecture#7 Call by value and reference in c++

  • 1.
    EC-102 Computer System& Programming Lecture #6 Instructor: Jahan Zeb Department of Computer Engineering (DCE) College of E&ME
  • 2.
    References and ReferenceParameters  Call by value – Copy of data passed to function – Changes to copy do not change original – Prevent unwanted side effects  Call by reference – Function can directly access data – Changes affect original
  • 3.
    Reference Parameters  Referenceparameter – Alias for argument in function call • Passes parameter by reference – Use & after data type in prototype • void myFunction( int &data ) • Read “data is a reference to an int” – Function call format the same • However, original can now be changed
  • 4.
    1 // Fig.3.20: fig03_20.cpp 2 // Comparing pass-by-value and pass-by-reference 3 // with references. 4 #include <iostream> 5 6 using std::cout; 7 using std::endl; 8 9 int squareByValue( int ); // function prototype 10 void squareByReference( int & ); // function prototype 11 12 int main() 13 { 14 int x = 2; 15 int z = 4; 16 17 // demonstrate squareByValue 18 cout << "x = " << x << " before squareByValuen"; 19 cout << "Value returned by squareByValue: " 20 << squareByValue( x ) << endl; 21 cout << "x = " << x << " after squareByValuen" << endl; 22 Notice the & operator, indicating pass-by-reference.
  • 5.
    23 // demonstratesquareByReference 24 cout << "z = " << z << " before squareByReference" << endl; 25 squareByReference( z ); 26 cout << "z = " << z << " after squareByReference" << endl; 27 28 return 0; // indicates successful termination 29 } // end main 30 31 // squareByValue multiplies number by itself, stores the 32 // result in number and returns the new value of number 33 int squareByValue( int number ) 34 { 35 return number *= number; // caller's argument not modified 36 37 } // end function squareByValue 38 39 // squareByReference multiplies numberRef by itself and 40 // stores the result in the variable to which numberRef 41 // refers in function main 42 void squareByReference( int &numberRef ) 43 { 44 numberRef *= numberRef; // caller's argument modified 45 46 } // end function squareByReference Changes number, but original parameter (x) is not modified. Changes numberRef, an alias for the original parameter. Thus, z is changed.
  • 6.
    x = 2before squareByValue Value returned by squareByValue: 4 x = 2 after squareByValue   z = 4 before squareByReference z = 16 after squareByReference
  • 7.
    References and ReferenceParameters References as aliases to other variables – Refer to same variable – Can be used within a function int count = 1; // declare integer variable count Int &cRef = count; // create cRef as an alias for count ++cRef; // increment count (using its alias)  References must be initialized when declared – Otherwise, compiler error – Dangling reference • Reference to undefined variable
  • 8.
    1 // Fig.3.21: fig03_21.cpp 2 // References must be initialized. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int main() 9 { 10 int x = 3; 11 12 // y refers to (is an alias for) x 13 int &y = x; 14 15 cout << "x = " << x << endl << "y = " << y << endl; 16 y = 7; 17 cout << "x = " << x << endl << "y = " << y << endl; 18 19 return 0; // indicates successful termination 20 21 } // end main x = 3 y = 3 x = 7 y = 7 y declared as a reference to x.
  • 9.
    1 // Fig.3.22: fig03_22.cpp 2 // References must be initialized. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int main() 9 { 10 int x = 3; 11 int &y; // Error: y must be initialized 12 13 cout << "x = " << x << endl << "y = " << y << endl; 14 y = 7; 15 cout << "x = " << x << endl << "y = " << y << endl; 16 17 return 0; // indicates successful termination 18 19 } // end main 'y' : references must be initialized Uninitialized reference – compiler error.
  • 10.
    Default Arguments  Functioncall with omitted parameters – If not enough parameters, rightmost go to their defaults – Default values • Can be constants, global variables, or function calls  Set defaults in function prototype int myFunction( int x = 1, int y = 2, int z = 3 ); – myFunction(3) • x = 3, y and z get defaults (rightmost) – myFunction(3, 5) • x = 3, y = 5 and z gets default
  • 11.
    1 // Fig.3.23: fig03_23.cpp 2 // Using default arguments. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function prototype that specifies default arguments 9 int boxVolume( int length = 1, int width = 1, int height = 1 ); 10 11 int main() 12 { 13 // no arguments--use default values for all dimensions 14 cout << "The default box volume is: " << boxVolume(); 15 16 // specify length; default width and height 17 cout << "nnThe volume of a box with length 10,n" 18 << "width 1 and height 1 is: " << boxVolume( 10 ); 19 20 // specify length and width; default height 21 cout << "nnThe volume of a box with length 10,n" 22 << "width 5 and height 1 is: " << boxVolume( 10, 5 ); 23 Set defaults in function prototype. Function calls with some parameters missing – the rightmost parameters get their defaults.
  • 12.
    24 // specifyall arguments 25 cout << "nnThe volume of a box with length 10,n" 26 << "width 5 and height 2 is: " << boxVolume( 10, 5, 2 ) 27 << endl; 28 29 return 0; // indicates successful termination 30 31 } // end main 32 33 // function boxVolume calculates the volume of a box 34 int boxVolume( int length, int width, int height ) 35 { 36 return length * width * height; 37 38 } // end function boxVolume The default box volume is: 1   The volume of a box with length 10, width 1 and height 1 is: 10   The volume of a box with length 10, width 5 and height 1 is: 50   The volume of a box with length 10, width 5 and height 2 is: 100
  • 13.
    Unary Scope ResolutionOperator  Unary scope resolution operator (::) – Access global variable if local variable has same name – Not needed if names are different – Use ::variable • y = ::x + 3; – Good to avoid using same names for locals and globals
  • 14.
    Function Overloading  Functionoverloading – Functions with same name and different parameters – Should perform similar tasks • I.e., function to square ints and function to square floats int square( int x) {return x * x;} float square(float x) { return x * x; }  Overloaded functions distinguished by signature – Based on name and parameter types (order matters) – Name mangling • Encodes function identifier with parameters – Type-safe linkage • Ensures proper overloaded function called
  • 15.
    1 // Fig.3.25: fig03_25.cpp 2 // Using overloaded functions. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function square for int values 9 int square( int x ) 10 { 11 cout << "Called square with int argument: " << x << endl; 12 return x * x; 13 14 } // end int version of function square 15 16 // function square for double values 17 double square( double y ) 18 { 19 cout << "Called square with double argument: " << y << endl; 20 return y * y; 21 22 } // end double version of function square 23 Overloaded functions have the same name, but the different parameters distinguish them.
  • 16.
    24 int main() 25{ 26 int intResult = square( 7 ); // calls int version 27 double doubleResult = square( 7.5 ); // calls double version 28 29 cout << "nThe square of integer 7 is " << intResult 30 << "nThe square of double 7.5 is " << doubleResult 31 << endl; 32 33 return 0; // indicates successful termination 34 35 } // end main Called square with int argument: 7 Called square with double argument: 7.5   The square of integer 7 is 49 The square of double 7.5 is 56.25 The proper function is called based upon the argument (int or double).