Topic : Operator Overloading in C# Programming Language.

Operator Overloading:



In an OOP language like C#, Operator Overloading provides a Much More Natural way of Implementing the Operations on custom types. Suppose we have two Numbers, and we want to add these two Numbers, how to do it? well actually, it’s really simple to add two numbers using +(plus) Operator. but how about, if we want to add two objects? can we do it using +(plus) Operator? No, we can't, so in this case, we need overload this +(plus) Operator to perform addition on Objects.

Operator overloading provides a much natural abstraction for the types. When we think about a possible operation on some data type we can think of binary operators, unary operators, relational operators and perhaps some conversion operations to and from the basic types. In C# achieving all this is possible using operator overloading.



The mechanism of giving a special meaning to a standard C# operator with respect to a user-defined data type such as classes or structures is known as operator overloading.



Operator overloading allows us to redefine the way operator works for user-defined types Like Classes or Structures. some Classes already contain the Prototype and Methods of + operator. so, C# Compiler knows how to add 2 integers using + operator. but it doesn’t know how to add two objects. so, we need to overload the operator, mean we need to add another Method using the same operator.


How to Overload the Operator?

operator Overloading can be done by Implementing a Method which can be a Member Method of class, Non-member Method of class, or a Friend Method of class. but in this tutorial, we will Implement the Method as Member Method of class. To overload an Operator, we need to define a special Operator Method With Special Keyword operator followed by the symbol for the operator being denied. just similar to any other method, an overloaded operator has a return type and a parameter list. The basic Syntax for Operator Overloading:



Access-specifier Method-Name operator + ( Parameterlist)
{
    //Method body
}

  • In Above Syntax:

    » Access-specifier define the scope of access. it could be Private, public, or Protected.
    » Method-Name could be any valid name for that Operator overloading method.
    » operator is the keyword, using to overload any operator.
    » + is the operator to be overload. it could be Unary operator, BinaryOperators and Comparison Operators.



Let's have an Example here, where we will try to make addition of Objects. we will overload plus(+) Operator. and will apply on Object to add some numbers.


/*Example - Operator Overloading - InfoBrother*/

using System;
namespace OperatorOverloading
{
    class Program
    {
        int L, M, N;   

        public Program()   //constructor
        {
            L = M = N = 0;
        }

        //Constructor with parameter.
        public Program(int X, int Y, int Z)
        {
            L = X;
            M = Y;
            N = Z;
        }

        //Method to overload Plus(+) Operator.
        public static Program operator +(Program Obj1, Program Obj2)
        {
            Program result = new Program();
            result.L = Obj1.L + Obj2.L;
            result.M = Obj1.M + Obj2.M;
            result.N = Obj1.N + Obj2.N;
            return result;
        }

        //Method to Display Result:
        public void show()
        {
            Console.WriteLine(L + " | " + M + " | " + N);
        }

        //main method:
        static void Main(string[] args)
        {
            //Object Creation:
            Program objA = new Program(5, 5, 5);
            Program objB = new Program(10, 20, 30);
            Program objC;

            //Value of ObjA:
            Console.WriteLine("The value of ObjA: ");
            objA.show();
            Console.WriteLine();

            //Value of ObjB
            Console.WriteLine("The value of ObjB: ");
            objB.show();
            Console.WriteLine();

            //Addition of Object:
            objC = objA + objB;  
            Console.WriteLine("Result of ObjA + ObjB: ");
            objC.show();
            Console.WriteLine();

            Console.ReadKey();

        }
    }
}


Overloadable and Non-Overloadable Operators.

In C# we can Overload some Operators, and some operators can't be overloaded. the following table describes the Overload Ability of the Operators in C#:


OperatorsDescription

We Can Overload These Operators:

+, -, !, ~, ++, --, true, false These Unary Operators take one Operand and can be Overloaded.
+, -, *, /, %, &, |, ^, <<, >>These Binary Operators take one Operand and can be Overloaded.
==, !=, <, >, <=, >=The comparison Operators can be Overloaded.
&&, ||The conditional logical operators cannot be overloaded, but they are evaluated using & and |, which can be overloaded.

We Can Not Overload These Operators:

[]The Array Indexing Operator can't be Overloaded, but we can define indexers.
(T)xThe Cast Operator can't be Overloaded. but we can define new conversion Operators.
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=Assignment operators cannot be overloaded, but +=, for example, is evaluated using +, which can be overloaded.
=, (dot)., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeofThese Operators can't be Overloaded.


The comparison operators, if overloaded, must be overloaded in pairs; that is, if == is overloaded, != must also be overloaded. The reverse is also true, where overloading != requires an overload for ==. The same is true for comparison operators < and > and for <= and >=.


Let's take an example here, where we will try to overload some more Operators.


/*Example - Operator Overloading - InfoBrother*/

using System;
namespace OperatorOvlApplication
{
    class Box
    {
        private double length;    // Length of a box
        private double breadth;   // Breadth of a box
        private double height;    // Height of a box

        public double getVolume()
        {
            return length * breadth * height;
        }

        public void setLength(double len)
        {
            length = len;
        }

        public void setBreadth(double bre)
        {
            breadth = bre;
        }


        public void setHeight(double hei)
        {
            height = hei;
        }

        // Overload + operator to add Boxes Object.
        public static Box operator +(Box b, Box c)
        {
            Box box = new Box();
            box.length = b.length + c.length;
            box.breadth = b.breadth + c.breadth;
            box.height = b.height + c.height;
            return box;
        }

        // Overload == operator to compare two Boxes Object.
        public static bool operator ==(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length == rhs.length && lhs.height == rhs.height && lhs.breadth == rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        // Overload != operator to Compare Boxes Object.
        public static bool operator !=(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length != rhs.length || lhs.height != rhs.height || lhs.breadth != rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        // Overload < operator to Compare Boxes Object.
        public static bool operator <(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length < rhs.length && lhs.height < rhs.height && lhs.breadth < rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        // Overload > operator to Compare Boxes Object.
        public static bool operator >(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length > rhs.length && lhs.height > rhs.height && lhs.breadth > rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        // Overload <= operator to Compare Boxes Object.
        public static bool operator <=(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length <= rhs.length && lhs.height <= rhs.height && lhs.breadth <= rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        // Overload >= operator to Compare Boxes Object.
        public static bool operator >=(Box lhs, Box rhs)
        {
            bool status = false;
            if (lhs.length >= rhs.length && lhs.height >= rhs.height && lhs.breadth >= rhs.breadth)
            {
                status = true;
            }
            return status;
        }

        public override string ToString()
        {
            return String.Format("({0}, {1}, {2})", length, breadth, height);
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Box Box1 = new Box();   // Declare Box1 of type Box
            Box Box2 = new Box();   // Declare Box2 of type Box
            Box Box3 = new Box();   // Declare Box3 of type Box
            Box Box4 = new Box();   // Declare Box4 of type Box
            double volume = 0.0;    // Store the volume of a box here

            // box 1 specification
            Box1.setLength(6.0);
            Box1.setBreadth(7.0);
            Box1.setHeight(5.0);

            // box 2 specification
            Box2.setLength(12.0);
            Box2.setBreadth(13.0);
            Box2.setHeight(10.0);

            //displaying the Boxes using the overloaded ToString():
            Console.WriteLine("Box 1: {0}", Box1.ToString());
            Console.WriteLine("Box 2: {0}", Box2.ToString());

            // volume of box 1
            volume = Box1.getVolume();
            Console.WriteLine("Volume of Box1 : {0}", volume);

            // volume of box 2
            volume = Box2.getVolume();
            Console.WriteLine("Volume of Box2 : {0}", volume);

            // Add two object as follows:
            Box3 = Box1 + Box2;
            Console.WriteLine("Box 3: {0}", Box3.ToString());

            // volume of box 3
            volume = Box3.getVolume();
            Console.WriteLine("Volume of Box3 : {0}", volume);

            //comparing the boxes
            if (Box1 > Box2)
                Console.WriteLine("Box1 is greater than Box2");
            else
                Console.WriteLine("Box1 is  greater than Box2");


            if (Box1 < Box2)
                Console.WriteLine("Box1 is less than Box2");
            else
                Console.WriteLine("Box1 is not less than Box2");


            if (Box1 >= Box2)
                Console.WriteLine("Box1 is greater or equal to Box2");
            else
                Console.WriteLine("Box1 is not greater or equal to Box2");


            if (Box1 <= Box2)
                Console.WriteLine("Box1 is less or equal to Box2");
            else
                Console.WriteLine("Box1 is not less or equal to Box2");


            if (Box1 != Box2)
                Console.WriteLine("Box1 is not equal to Box2");
            else
                Console.WriteLine("Box1 is not greater or equal to Box2");
            Box4 = Box3;


            if (Box3 == Box4)
                Console.WriteLine("Box3 is equal to Box4");
            else
                Console.WriteLine("Box3 is not equal to Box4");


            Console.ReadKey();
        }
    }
}


  • Operator Rules:

    C# Enfores certain rule when we Overload Operators.
    » WE must implement the operator overload in the type that will use it. This is sensible because it makes the type self-contained.
    » We must implement matching operators. For example, if We overload ==, you must also implement !=. The same goes for <= and >=.
    » When you implement an operator, its compound operator works also. For example, since the + operator for the Matrix type was implemented, you can also use the += operator on Matrix types.
    » Operator overload methods can't return void.
    » The operator Method must be static.

















I Tried my Best to Provide you complete Information regarding this topic in very easy and conceptual way. but still if you have any Problem to understand this topic, or do you have any Questions, Feel Free to Ask Question. i'll do my best to Provide you what you need.

Sardar Omar.
InfoBrother





WRITE FOR INFOBROTHER

Advertising






Advertisement