Module 08 Default Fn Overloading
Module 08 Default Fn Overloading
L
Partha Pratim
Das
Programming in Modern C++
E
Objectives &
Outline
Module M08: Default Parameters & Function Overloading
T
Default
Parameters
Examples
P
Highlights
Restrictions
Partha Pratim Das
N
Function
Overloading
Examples
Restrictions
Department of Computer Science and Engineering
Rules
Indian Institute of Technology, Kharagpur
Overload
Resolution
[email protected]
Exact Match
Promotion &
Conversion All url’s in this module have been accessed in September, 2021 and found to be functional
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
• Studied the difference between call-by-value and call-by-reference
E
Objectives &
Outline • Studied the difference between return-by-value and return-by-reference
T
Default
Parameters • Discussed the difference between References and Pointers
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
• Understand Function Overloading and Resolution
E
Objectives &
Outline
T
Default
Parameters
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
L
Partha Pratim
Das
Highlights
E
Objectives &
Outline Restrictions on default parameters
T
Default
Parameters 2 Function Overloading
Examples
Examples
P
Highlights
Restrictions Restrictions
N
Function
Overloading
Rules
Examples
Restrictions
3 Overload Resolution
Rules Exact Match
Overload
Resolution
Promotion & Conversion
Exact Match Examples
Promotion &
Conversion Ambiguity
Examples
Ambiguity 4 How to overload Default Parameter?
Defa. Parames in
Overloading 5 Module Summary
Module Summary Programming in Modern C++ Partha Pratim Das M08.4
Default Parameters
Module M08
L
Partha Pratim
Das
E
Objectives &
Outline
T
Default
Parameters
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Default Parameters
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
L
Partha Pratim HWND WINAPI CreateWindow( hWnd = CreateWindow(
Das
_In_opt_ LPCTSTR lpClassName, ClsName,
E
Objectives & _In_opt_ LPCTSTR lpWindowName, WndName,
Outline
_In_ DWORD dwStyle, WS_OVERLAPPEDWINDOW,
T
Default _In_ int x, CW_USEDEFAULT,
Parameters
Examples
_In_ int y, CW_USEDEFAULT,
P
Highlights _In_ int nWidth, CW_USEDEFAULT,
Restrictions _In_ int nHeight, CW_USEDEFAULT,
N
Function _In_opt_ HWND hWndParent, NULL,
Overloading
Examples
_In_opt_ HMENU hMenu, NULL,
Restrictions _In_opt_ HINSTANCE hInstance, hInstance,
Rules _In_opt_ LPVOID lpParam NULL
Overload ); );
Resolution
Exact Match
Promotion & • There are 11 parameters in CreateWindow()
Conversion
Examples
• Of these 11, 8 parameters (4 are CWUSEDEFAULT, 3 are NULL, and 1 is hInstance) usually get same
Ambiguity values in most calls
Defa. Parames in • Instead of using these 8 fixed valued Parameters at call, we may assign the values in formal parameter
Overloading • C++ allows us to do so through the mechanism called Default parameters
Module Summary Programming in Modern C++ Partha Pratim Das M08.6
Program 08.01: Function with a default parameter
Module M08
#include <iostream>
L
Partha Pratim
Das using namespace std;
E
Objectives &
Outline int IdentityFunction(int a = 10) { // Default value for parameter a
return (a);
T
Default
Parameters }
Examples
P
Highlights
Restrictions
int main() {
int x = 5, y;
N
Function
Overloading
Examples y = IdentityFunction(x); // Usual function call. Actual parameter taken as x = 5
Restrictions
Rules
cout << "y = " << y << endl;
Overload
Resolution y = IdentityFunction(); // Uses default parameter. Actual parameter taken as 10
Exact Match cout << "y = " << y << endl;
Promotion &
Conversion
}
Examples ----------
Ambiguity y = 5
Defa. Parames in y = 10
Overloading
L
Partha Pratim
Das
int Add(int a = 10, int b = 20) {
E
Objectives & return (a + b);
Outline
}
T
Default int main() { int x = 5, y = 6, z;
Parameters
Examples
P
Highlights z = Add(x, y); // Usual function call -- a = x = 5 & b = y = 6
Restrictions cout << "Sum = " << z << endl;
N
Function
Overloading
Examples
z = Add(x); // One parameter defaulted -- a = x = 5 & b = 20
Restrictions cout << "Sum = " << z << endl;
Rules
Module M08
L
Partha Pratim
Das
• Default values are specified while prototyping the function
E
Objectives &
Outline • Default parameters are required while calling functions with fewer arguments or without
T
Default
Parameters
any argument
Examples
• Better to use default value for less used parameters
P
Highlights
Restrictions
• Default arguments may be expressions also
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
• All parameters to the right of a parameter with default argument must have default
arguments (function f violates)
L
Partha Pratim
Das
• Default arguments cannot be re-defined (second signature of function g violates)
E
Objectives &
Outline • All non-defaulted parameters needed in a call (first call of g() violates)
#include <iostream>
T
Default
Parameters
Examples void f(int, double = 0.0, char *);
P
Highlights // Error C2548: f: missing default parameter for parameter 3
Restrictions
N
Function void g(int, double = 0, char * = NULL); // OK
Overloading void g(int, double = 1, char * = NULL);
Examples // Error C2572: g: redefinition of default parameter : parameter 3
Restrictions // Error C2572: g: redefinition of default parameter : parameter 2
Rules
Module M08 • Default parameters to be supplied only in a header file and not in the definition of a
function
L
Partha Pratim
Das
// Header file: myFunc.h
E
Objectives & void g(int, double, char = ’a’); // Defaults ch
Outline
void g(int i, double f = 0.0, char ch); // A new overload. Defaults f & ch
T
Default void g(int i = 0, double f, char ch); // A new overload. Defaults i, f & ch
Parameters
// void g(int i = 0, double f = 0.0, char ch = ’a’); // Alternate signature. Defaults all in one go
Examples
P
----------------------------------------------------
Highlights
// Source File
Restrictions
#include <iostream>
N
Function using namespace std;
Overloading
#include "myFunc.h" // Defaults taken from header
Examples
Restrictions
void g(int i, double d, char c) { cout << i << ’ ’ << d << ’ ’ << c << endl; } // No defaults here
Rules
----------------------------------------------------
// Application File
Overload
Resolution
#include <iostream>
Exact Match
#include "myFunc.h"
Promotion &
int main() { int i = 5; double d = 1.2; char c = ’b’;
Conversion g(); // Prints: 0 0 a
Examples g(i); // Prints: 5 0 a
Ambiguity
g(i, d); // Prints: 5 1.2 a
Defa. Parames in g(i, d, c); // Prints: 5 1.2 b
Overloading }
Module Summary Programming in Modern C++ Partha Pratim Das M08.11
Function Overloading
Module M08
L
Partha Pratim
Das
E
Objectives &
Outline
T
Default
Parameters
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Function Overloading
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
• Similar functions with different data types and algorithms
typedef struct { int data[10][10]; } Mat;
L
Partha Pratim // 2D Matrix
Das typedef struct { int data[1][10]; } VecRow; // Row Vector
typedef struct { int data[10][1]; } VecCol; // Column Vector
E
Objectives &
Outline
void Multiply_M_M (Mat a, Mat b, Mat* c); // c = a * b
T
Default
Parameters
void Multiply_M_VC (Mat a, VecCol b, VecCol* c); // c = a * b
Examples
void Multiply_VR_M (VecRow a, Mat b, VecRow* c); // c = a * b
P
Highlights
void Multiply_VC_VR(VecCol a, VecRow b, Mat* c); // c = a * b
Restrictions void Multiply_VR_VC(VecRow a, VecCol b, int* c); // c = a * b
N
Function
Overloading int main() {
Examples Mat m1, m2, rm; VecRow rv, rrv; VecCol cv, rcv; int r;
Restrictions Multiply_M_M (m1, m2, &rm); // rm <-- m1 * m2
Rules Multiply_M_VC (m1, cv, &rcv); // rcv <-- m1 * cv
Overload
Multiply_VR_M (rv, m2, &rrv); // rrv <-- rv * m2
Resolution Multiply_VC_VR(cv, rv, &rm); // rm <-- cv * rv
Exact Match Multiply_VR_VC(rv, cv, &r); // r <-- rv * cv
Promotion & return 0;
Conversion
}
Examples
Ambiguity • 5 multiplication functions share similar functionality but different argument types
• C treats them by 5 different function names. Makes it difficult for the user to remember and use
Defa. Parames in
Overloading • C++ has an elegant solution
Module Summary Programming in Modern C++ Partha Pratim Das M08.13
Function overloads: Matrix Multiplication in C++
Module M08
• Functions having the same name, similar functionality but different algorithms, and identified
by different interfaces data types
L
Partha Pratim
Das
typedef struct { int data[10][10]; } Mat; // 2D Matrix
typedef struct { int data[1][10]; } VecRow; // Row Vector
E
Objectives &
Outline typedef struct { int data[10][1]; } VecCol; // Column Vector
T
Default
Parameters void Multiply(const Mat& a, const Mat& b, Mat& c); // c = a * b
Examples void Multiply(const Mat& a, const VecCol& b, VecCol& c); // c = a * b
P
Highlights void Multiply(const VecRow& a, const Mat& b, VecRow& c); // c = a * b
Restrictions void Multiply(const VecCol& a, const VecRow& b, Mat& c); // c = a * b
N
Function void Multiply(const VecRow& a, const VecCol& b, int& c); // c = a * b
Overloading
Examples int main() {
Restrictions Mat m1, m2, rm; VecRow rv, rrv; VecCol cv, rcv; int r;
Rules
Multiply(m1, m2, rm); // rm <-- m1 * m2
Overload Multiply(m1, cv, rcv); // rcv <-- m1 * cv
Resolution Multiply(rv, m2, rrv); // rrv <-- rv * m2
Exact Match
Multiply(cv, rv, rm); // rm <-- cv * rv
Promotion &
Conversion Multiply(rv, cv, r); // r <-- rv * cv
Examples return 0;
Ambiguity }
Defa. Parames in • These 5 functions having different argument types are represented as one function name (Multiply) in C++
Overloading • This is called Function Overloading or Static Polymorphism
Module Summary Programming in Modern C++ Partha Pratim Das M08.14
Program 08.03/04: Function Overloading
Module M08
• Define multiple functions having the same name
• Binding happens at compile time
L
Partha Pratim
Das
Same # of Parameters Different # of Parameters
E
Objectives &
Outline #include <iostream> #include <iostream>
T
Default using namespace std; using namespace std;
Parameters int Add(int a, int b) { return (a + b); } int Area(int a, int b) return (a * b);
Examples double Add(double c, double d) { return (c + d); } int Area(int c) { return (c * c); }
P
Highlights
int main() { int main() {
Restrictions
int x = 5, y = 6, z; int x = 10, y = 12, z = 5, t;
N
Function z = Add(x, y); // int Add(int, int) t = Area(x, y); // int Area(int, int)
Overloading cout << "int sum = " << z; cout << "Area of Rectangle = " << t;
Examples
Restrictions
double s = 3.5, t = 4.25, u; int z = 5, u;
Rules
u = Add(s, t); // double Add(double, double) u = Area(z); // int Area(int)
Overload cout << "double sum = " << u << endl; cout << " Area of Square = " << u << endl;
Resolution
} }
Exact Match
Promotion &
Conversion int sum = 11 double sum = 7.75 Area of Rectangle = 12 Area of Square = 25
Examples
Ambiguity • Same Add function to add two ints or two doubles • Same Area function for rectangles and for squares
Defa. Parames in • Same # of parameters but different types • Different number of parameters
Overloading
Module M08 • Two functions having the same signature but different return types cannot be overloaded
#include <iostream>
L
Partha Pratim
Das using namespace std;
E
Objectives &
Outline
int Area(int a, int b) { return (a * b); }
double Area(int a, int b) { return (a * b); }
T
Default // Error C2556: double Area(int,int): overloaded function differs only by return type
Parameters
// from int Area(int,int)
Examples
P
Highlights
// Error C2371: Area: redefinition; different basic types
Restrictions
int main() {
N
Function
Overloading
int x = 10, y = 12, z = 5, t;
Examples
double f;
Restrictions
Rules t = Area(x, y);
// Error C2568: =: unable to resolve function overload
Overload
Resolution // Error C3861: Area: identifier not found
Exact Match
Promotion & cout << "Multiplication = " << t << endl;
Conversion
Examples
f = Area(y, z); // Errors C2568 and C3861 as above
Ambiguity
cout << "Multiplication = " << f << endl;
Defa. Parames in }
Overloading
Module M08
L
Partha Pratim
Das
• Functions with the same name must have different number of formal parameters and/or
E
Objectives &
Outline different types of formal parameters
T
Default
Parameters
• Function selection is based on the number and the types of the actual parameters at
Examples the places of invocation
P
Highlights
Restrictions
• Function selection (Overload Resolution) is performed by the compiler
N
Function
Overloading • Two functions having the same signature but different return types will result in a
Examples
Restrictions
compilation error due to attempt to re-declare
Rules
• Overloading allows Static Polymorphism
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
E
Objectives &
Outline
T
Default
Parameters
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Overload Resolution
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
◦ Identify the set of Candidate Functions
E
Objectives &
Outline ◦ From the set of candidate functions identify the set of Viable Functions
◦ Select the Best viable function through (Order is important)
T
Default
Parameters
Examples . Exact Match
P
Highlights
Restrictions
. Promotion
. Standard type conversion
N
Function
Overloading
Examples
. User defined type conversion
Restrictions
Rules
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
◦ Most common
E
Objectives &
Outline • Array-to-pointer conversion
T
Default
Parameters
Definitions: int ar[10];
Examples void f(int *a);
P
Highlights
Restrictions
Call: f(ar)
N
Function
Overloading
Definitions: typedef int (*fp) (int);
Examples void f(int, fp);
Restrictions • Function-to-pointer conversion
Rules int g(int);
Overload Call: f(5, g)
Resolution
Exact Match • Qualification conversion
Promotion &
Conversion
Examples
◦ Converting pointer (only) to const pointer
Ambiguity
Defa. Parames in
Overloading
Module M08
• Promotion
L
Partha Pratim
Das
◦ Objects of an integral type can be converted to another wider integral type, that is,
E
Objectives &
Outline a type that can represent a larger set of values. This widening type of conversion is
called integral promotion
T
Default
Parameters
Examples
◦ C++ promotions are value-preserving, as the value after the promotion is
P
Highlights
Restrictions
guaranteed to be the same as the value before the promotion
◦ Examples
N
Function
Overloading
Examples
. char to int; float to double
Restrictions . enum to int / short / unsigned int / ...
Rules
Overload
. bool to int
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
L
Partha Pratim
Das
qualifiers signed or unsigned
E
Objectives &
Outline ◦ Floating point Conversions from less precise floating type to a more precise floating type
like float to double or double to long double. Conversion can happen to a less precise
T
Default
Parameters
type, if it is in a range representable by that type
Examples
P
Highlights ◦ Conversions between integral and floating point types: Certain expressions can cause
Restrictions
objects of floating type to be converted to integral types, or vice versa. May be dangerous!
N
Function
Overloading . When an object of integral type is converted to a floating type, and the original value is
Examples
not representable exactly, the result is either the next higher or the next lower
Restrictions
Rules representable value
Overload . When an object of floating type is converted to an integral type, the fractional part is
Resolution
Exact Match
truncated, or rounded toward zero. A number like 1.3 is converted to 1, and -1.3 is
Promotion & converted to -1
Conversion
Examples ◦ Pointer Conversions: Pointers can be converted during assignment, initialization,
Ambiguity
comparison, and other expressions
Defa. Parames in
Overloading ◦ Bool Conversion: int to bool or vice versa based on the context
Module Summary Programming in Modern C++ Partha Pratim Das M08.22
Example: Overload Resolution with one parameter
Module M08
• In the context of a list of function prototypes:
L
Partha Pratim
Das int g(double); // F1
void f(); // F2
E
Objectives &
Outline
void f(int); // F3
double h(void); // F4
T
Default int g(char, int); // F5
Parameters
Examples
void f(double, double = 3.4); // F6
P
Highlights
void h(int, double); // F7
Restrictions void f(char, char *); // F8
The call site to resolve is:
N
Function
Overloading
Examples
f(5.6);
Restrictions
Rules
• Resolution:
Overload
◦ Candidate functions (by name): F2, F3, F6, F8
Resolution ◦ Viable functions (by # of parameters): F3, F6
Exact Match ◦ Best viable function (by type double – Exact Match): F6
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
• Consider the overloaded function signatures:
L
Partha Pratim
Das int fun(float a) {...} // Function 1
int fun(float a, int b) {...} // Function 2
E
Objectives &
Outline int fun(float x, int y = 5) {...} // Function 3
T
Default
Parameters int main() {
Examples
float p = 4.5, t = 10.5;
P
Highlights
Restrictions
int s = 30;
N
Function
Overloading fun(p, s); // CALL - 1
Examples fun(t); // CALL - 2
Restrictions
Rules
return 0;
}
Overload
Resolution
• CALL - 1: Matches Function 2 & Function 3
Exact Match
Promotion & • CALL - 2: Matches Function 1 & Function 3
Conversion
Examples • Results in ambiguity for both calls
Ambiguity
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
E
Objectives &
Outline
T
Default
Parameters
Examples
P
Highlights
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Default Parameters in Overloading
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading
Module M08
• Compilers deal with default parameters as a special case of function overloading
• These need to be mixed carefully
L
Partha Pratim
Das
E
Objectives & Default Parameters Function Overload
Outline
T
Default #include <iostream> #include <iostream>
Parameters using namespace std; using namespace std;
Examples int f(int a = 1, int b = 2); int f();
P
Highlights
int f(int);
Restrictions
int f(int, int);
N
Function
Overloading
int main() { int main() {
Examples
int x = 5, y = 6; int x = 5, y = 6;
Restrictions
Rules
f(); // a = 1, b = 2 f(); // int f();
Overload f(x); // a = x = 5, b = 2 f(x); // int f(int);
Resolution
f(x, y); // a = x = 5, b = y = 6 f(x, y); // int f(int, int);
Exact Match
Promotion &
} }
Conversion
Examples
Ambiguity • Function f has 2 parameters defaulted • Function f is overloaded with up to 2 parameters
Defa. Parames in • f can have 3 possible forms of call • f can have 3 possible forms of call
Overloading • No overload here use default parameters. Can it?
Module Summary Programming in Modern C++ Partha Pratim Das M08.26
Program 08.08: Default Parameter & Function Overload
L
Partha Pratim
Das
#include <iostream>
E
Objectives & using namespace std;
Outline // Overloaded Area functions
int Area(int a, int b = 10) { return (a * b); }
T
Default
Parameters double Area(double c, double d) { return (c * d); }
Examples int main() { int x = 10, y = 12, t; double z = 20.5, u = 5.0, f;
P
Highlights t = Area(x); // Binds int Area(int, int = 10)
Restrictions cout << "Area = " << t << endl; // Area = 100
N
Function
Overloading t = Area(x, y); // Binds int Area(int, int = 10)
Examples cout << "Area = " << t << endl; // Area = 120
Restrictions
Rules f = Area(z, u); // Binds double Area(double, double)
Overload cout << "Area = " << f << endl; // Area = 102.5
Resolution
Exact Match f = Area(z); // Binds int Area(int, int = 10)
Promotion &
Conversion
cout << "Area = " << f << endl; // Area = 200
Examples
Ambiguity // Un-resolvable between int Area(int a, int b = 10) and double Area(double c, double d)
f = Area(z, y); // Error: call of overloaded Area(double&, int&) is ambiguous
Defa. Parames in
Overloading }
Module Summary Programming in Modern C++ Partha Pratim Das M08.27
Program 08.09: Default Parameter & Function Overload
Module M08
• Function overloading with default parameters may fail
L
Partha Pratim
Das
#include <iostream>
using namespace std;
E
Objectives &
Outline int f();
int f(int = 0);
T
Default
Parameters int f(int, int);
Examples
P
Highlights int main() {
Restrictions int x = 5, y = 6;
N
Function
Overloading f(); // Error C2668: f: ambiguous call to overloaded function
Examples // More than one instance of overloaded function f
Restrictions // matches the argument list:
Rules // function f()
Overload // function f(int = 0)
Resolution
Exact Match f(x); // int f(int);
Promotion & f(x, y); // int f(int, int);
Conversion
Examples
Ambiguity
return 0;
}
Defa. Parames in
Overloading
Module M08
L
Partha Pratim
Das
• Identified the necessity of function overloading
E
Objectives &
Outline • Introduced static Polymorphism and discussed examples and restrictions
T
Default
Parameters • Discussed an outline for Overload resolution
Examples
P
Highlights • Discussed the mix of default Parameters and function overloading
Restrictions
N
Function
Overloading
Examples
Restrictions
Rules
Overload
Resolution
Exact Match
Promotion &
Conversion
Examples
Ambiguity
Defa. Parames in
Overloading