CSC/ECE 517 Fall 2010/ch5 5a KR: Difference between revisions
No edit summary |
|||
Line 106: | Line 106: | ||
===<b>Operator Overloading in C++</b>=== | ===<b>Operator Overloading in C++</b>=== | ||
Here most of the commonly used operators can be overloaded by defining functions for the same. For this purpose, we create what are known as operator functions. | Here most of the commonly used operators can be overloaded by defining functions for the same. For this purpose, we create what are known as operator functions. The following example overloads the '+' operator to add complex numbers. | ||
struct Complex { | struct Complex { | ||
Line 117: | Line 117: | ||
}; | }; | ||
Complex Complex::operator+( Complex &other ) { | Complex Complex::operator+( Complex &other ) { | ||
return Complex( re + other.re, im + other.im ); | return Complex( re + other.re, im + other.im ); | ||
Line 130: | Line 130: | ||
c.Display(); | c.Display(); | ||
} | } | ||
=References= | =References= |
Revision as of 23:10, 3 November 2010
Overloading-Good or Bad?
Introduction
Overloading can be broken down into Operator Overloading and Method/Function Overloading. Method overloading can be considered to be a type of polymorphism in which two methods with the same name are used to perform different functions according to the parameters passed to the methods. Operator overloading can be considered to be a type a polymorphism in which a particular operator is defined to perform another action.
Method/Function Overloading
This concept is seen typically in languages such as C++, Java, Ada. It allows us to create multiple methods with the same name which differ either in the type or number of arguments passed. Consider the following example. These are two definitions of the method test written in Java.
void test()
{ System.out.println(" "); }
void test(int a) {
System.out.println("a: " + a);
}
Here to call the first function, we do not pass in any parameter, whereas to call the second one, we pass an integer parameter. The choice as to which of these methods to invoke is decided by looking at the parameter type and number of parameters.
Function Overloading in C++
C++ is one of the language that supports method overloading. Consider the following example.
class arith
{
public:
void calc(int num1)
{ cout<<"Square of a given number: " <<num1*num1 <<endl; }
void calc(int num1, int num2 )
{ cout<<"Product of two whole numbers: " <<num1*num2 <<endl; } };
int main()
{
arith a; a.calc(5); a.calc(6,7);
}
In the above example, the function calc is overloaded. In the class arith there are two functions ‘calc’ with the same name. The first one takes an integer as parameter and prints the square of the number. The second calc function takes two integer numbers as parameters, multiplies the numbers and prints the product. So the output of the above example would be
Square of a given number: 25
Product of two whole numbers: 42
Method Overloading in Java
The concept is very much similar as in C++. For example:
void print(boolean a)
void print(char b)
void print(float c)
are all overloaded methods. However as Java supports this type of polymorphism via late binding, the decision as to which method to call is deferred until runtime.
Constructor Overloading
Constructor is used to create instances of that class, and is a special (instance) member function having the same name as the class whose types it is to create. If a class has no explicitly defined constructors then the compiler will generate default constructor implementation for the class. One can also overload constructors. We shall leave that for further reading.
Advantages of Method Overloading
It is always convenient to have same names for similar method capabilities rather than having long, complicated ones. Also, it allows to keep interface consistency and logically call the same method regardless of the data types passed in. Other advantages include saving memory space, consistency and readability.
Pitfalls of Method Overloading
In such an environment, programs containing ambiguity will not compile. The main cause of ambiguity in C++ involves automatic type conversions. Also Consider the following example snippet
void func(int a);
void func(int &a);
Here the second call will give an error. This is because the function cannot be overloaded if the only difference between the two parameters is that one is a reference and one is a value.
If overloading is used in excess, it may become difficult to determine which method is called by just reading the code. Also if a class does not have an explicitly defined default constructor and then you try to define another constructor, then you will not be able to make use of the default constructor.
Operator Overloading
This concept is seen in languages such as C++. Observation of its use in C++ has proved that operator overloading makes code almost impossible to maintain. Due to this fact, operator overloading was chosen to be absent in Java.
Operator Overloading in C++
Here most of the commonly used operators can be overloaded by defining functions for the same. For this purpose, we create what are known as operator functions. The following example overloads the '+' operator to add complex numbers.
struct Complex {
Complex( double r, double i ) : re(r), im(i) {} Complex operator+( Complex &other ); void Display( ) { cout << re << ", " << im << endl; }
private:
double re, im;
};
Complex Complex::operator+( Complex &other ) {
return Complex( re + other.re, im + other.im );
}
int main() {
Complex a = Complex( 1.2, 3.4 ); Complex b = Complex( 5.6, 7.8 ); Complex c = Complex( 0.0, 0.0 );
c = a + b; c.Display();
}
References
[1] Andrew Black, Kim. B. Bruce, James Noble. Designing the Next Educational Programming Language
[2] Operator Overloading
[3] Function Overloading
[4] Programming with C++ Part 2
[5] Method Overloading in Java