Learning C/C++ Step-By-Step - Page 15

15. Step-by-Step C/C++ --- C++ Programming - Operator Overloading

Operator Overloading

 1. Introduction
2. Operator
          • Rules of Operator Overloading
          • Restrictions on Operator Overloading
3. Overloading Unary Operators
4. Overloading Binary Operators
5. Operator Overloading with Strings

 

1. Introduction

 

// Assign a variable to another
#include <iostream>
using namespace std;
int main()
{
    int a = 10, b;     
    b = a;                // valid
    cout << b;
    return 0;
}

// Assign an object to another
#include <iostream>
using namespace std;
class emp
{
    public:
    int eno;
    float sal;
};
int main()
{
    emp e1= { 1001, 2300.45 },e2 ;
    cout << endl << e1.eno << e1.sal;
    e2 = e1;                            // valid
    cout << endl << e2.eno << e2.sal;
    return 0;
}

Expressions are common in every language; an expression is a collection of operands and operators. Where as an operation is a collection of expressions.
The above two programs demonstrate how variables/objects were assigned together.

Both programs are valid, they demonstrates the use of equalto ( = ) operator.

 

Operator overloading is one of the most exciting feature of object-oriented programming. It is used to overcome the situation like the above illegal structure operation. It can transform complex, obscure program listing into intuitively obvious ones.

Through Operator overloading we can see how the normal C++ operators can be given new meanings when applied to user-defined data types. The keyword operator is used to overload an operator, and the resulting operator will adopt the meaning supplied by the programmer.

For example using object we can perform direct string assignment operation.

 

// Program to assign a string to other
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
class string
{
     char *str;
     public:
          string() { }
          string(char *s) { str = s; }
          void putstring()
          {
               cout << str;
          }
};
int main()
{
     string s1("Computer");
     string s2;
     s2 = s1;
     s2.putstring();
     return 0;
}

 

2. Operator

type operator operator-symbol ( parameter-list )

The operator keyword declares a function specifying what operator-symbol means when applied to instances of a class. This gives the operator more than one meaning, or "overloads" it. The compiler distinguishes between the different meanings of an operator by examining the types of its operands.

Rules of Operator Overloading

  • You can overload the following operators:
  + - * / % ^
  ! = < > += –=
  ^= &= |= << >> <<=
  <= >= && || ++ ––
  ( ) [ ] new delete & |
  ~ *= /= %= >>= ==
  != , –> –>*    
  • If an operator can be used as either a unary or a binary operator, you can overload each use separately.
  • You can overload an operator using either a non-static member function or a global function that's a friend of a class. A global function must have at least one parameter that is of class type or a reference to class type.
  • If a unary operator is overloaded using a member function, it takes no arguments. If it is overloaded using a global function, it takes one argument.

If a binary operator is overloaded using a member function, it takes one argument. If it is overloaded using a global function, it takes two arguments.

Restrictions on Operator Overloading

  • You cannot define new operators, such as **.
  • You cannot change the precedence or grouping of an operator, nor can you change the numbers of operands it accepts.
  • You cannot redefine the meaning of an operator when applied to built-in data types.
  • Overloaded operators cannot take default arguments.
  • You cannot overload any preprocessor symbol, nor can you overload the following operators:
 

.

.*

::

?:

The assignment operator has some additional restrictions. It can be overloaded only as a non-static member function, not as a friend function. It is the only operator that cannot be inherited; a derived class cannot use a base class's assignment operator.

 

3. Overloading Unary Operators

Let’s start off by overloading a unary operator. Unary operators act on only one operand. ( An operand is simply a variable acted on by an operator). Examples of unary operators are the increment and decrement operators ++ and --, and the unary minus.

Example:
The following example demonstrates the use of increment operator ++.

 

#include <iostream>
using namespace std;
class counter
{
      private:
            unsigned int count;
      public:
            counter(){ count = 0; }
            int get_count()  { return count; }
            counter operator ++()
            {
                   count++;
                   counter temp;
                   temp.count = count;
                   return temp;
            }
};
int main()
{
      counter c1, c2;                            // c1 = 0,  c2 = 0
      cout << "\nC1 = " << c1.get_count();       // display
      cout << "\nC2 = " << c2.get_count();

      ++c1;                                      // c1 = 1
      c2 = ++c1 ;                                // c1 = 2, c2 = 2

      cout << "\nC1 = " << c1.get_count();       // display again
      cout << "\nC2 = " << c2++.get_count();     // c2 = 3
      return 0;
}

One more example to overloading unary minus.

 

#include <iostream>
using namespace std;
class subtract
{
          int a;
          int b;
     public:
          void getdata(int x, int y)
          {
               a = x; b = y;
          }
          void putdata()
          {
               cout<< endl << "A = " << a <<"B = " << b;
          }
          void operator -()
          {
               a = -a; b = -b;
          }
};

int main()
{
     subtract s;
     s.getdata(34, -6);
     cout << endl << "S : ";
     s.putdata();
     -s;
     cout << endl << "S : ";
     s.putdata();
     return 0;
}

 

4. Overloading Binary Operators

But operators can be overloaded just as easily as unary operators.  We will look at examples that overload arithmetic operators, comparison operators, and arithmetic assignment operators.

We have just seen how to overload a unary operator. The same mechanism can be used to overload a binary operator.

 

// Overloading + operator
#include <iostream>
using namespace std;
class time
{
          int hh; int mm; int ss;
     public:
          time( ) { }
          time(int h, int m, int s)
          {
               hh =h; mm = m; ss = s;
          }
          void disp_time()
          {
               cout << endl << hh<< " : "
               << mm << " : " << ss;
          }
          time operator+(time);
};

time time::operator+(time t)
{
     time temp;
     temp.hh = hh + t.hh;
     temp.mm = mm + t.mm;
     temp.ss = ss + t.ss;
     return temp;
}

int main()
{
     time t1(12,1,24) , t2(5, 23, 45), t3;
     t3 = t1 + t2;
     t3.disp_time();
     return 0;
}

 

5. Operator Overloading with Strings

C/C++ deals with strings quite differently; we never copy, concatenate, or compare strings using operators like other languages. C/C++ has built functions to perform the above operations. But C++ provides the facility to do every thing on strings using operators. That means we have to provide extra responsibility to operators to perform such things.

The following example demonstrates the comparison between two strings using comparison operator ==.

 

// Program to compare two strings using operator overloading
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;

enum boolean{ false, true };

class string
{
     char *str;
     public:
          string() { *str = NULL; }
          string(char *s) { str = s; }
          int operator ==(string ts)
          {
               if (strcmp(str, ts.str) >= 0)
                    return true;
               else
                    return false;
          }
};

int main()
{
     string s1("Computer");
     string s2("Computers");

     if(s1 == s2)
          cout << "Equal";
     else
          cout << "Not Equal";

     return 0;
}

 

// concatenation of two strings

#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;

class string
{
          char *str;
     public:
          string()
          {
               str = new char[30] ;
               *str = NULL;
          }
          string(char *s) { str = s; }
          string operator +(string ts)
          {
               string t;
               strcat(t.str, str);
               strcat(t.str, ts.str);
               return t;
          }
          void putstring()
          {
               cout << endl << str;
          }
};

int main()
{
     string s1("Computer"); string s2("Institute");
     s1.putstring(); s2.putstring();
     string s3;

     s3 = s1 + s2;

     s3.putstring();
     return 0;
}

Ref: Object-oriented Programming in Turbo C++: Robert Lafore

Share this page:

19 Comment(s)

Add comment

Comments

From: at: 2009-01-09 15:11:23

The tutorial looks so great. But I have some doubts. Why do you use "clrscr()" function and conio.h library, if you are using the C/C++ standard? (I found that in the pages number 4 and 5, but that is as far as i got).

From: at: 2009-01-20 16:25:53

I tried to lead learners from learning C to C++, so the pages 4 and 5 reflects most of the usage of C language, so it introduces users to learn about other header files.

From: Shantanu Goel at: 2009-01-08 04:44:05

Great tutorial Ganesh. And here is a link for people who finish your tutorial and want to learn a bit about how to make their code secure and optimized: Safer Code - Secure Coding in C/C++ This has a lot of stuff regularly published to cater to various security and performance related issues with C/C++ and anyone can follow it easily at a gradual pace.

From: Anonymous at: 2010-02-01 06:01:52

Very nice!

From: pickatutorial at: 2010-10-09 12:52:44

Great Work. Keep it up.

From: TodaysTech at: 2011-07-12 21:31:29

If anyone is interested, I have an ongoing blog that is covering the transition from the Business world to the Programming world.  Since it's from my own perspective, I think it can be easy to read and relate to for most first timers.

 http://livingtodaystech.blogspot.com/2011/07/learning-c.html

From: Crosility at: 2012-12-06 23:44:36

In the chart, it says 'vhar', not 'char'.

From: Jason at: 2013-04-16 14:58:31

Why using conio.h ?   It is not part of C standard, C++ standard, nor is it part of any Linux or Unix libraries.  

The inclusions of Microsoft specific libraries in chapters 4 & 5 have me doubting the validity the rest of the tutorial (learning c/cpp on Linux).

The tutorial is well written, however,  but I think it would be more appropriate on a .Net or Msdn blog. 

Thanks Ganesh!

From: Anonymous at: 2009-09-01 11:56:38

Shouldn't

\* 0001_hello.c *\ and  \* 0001_hello.cpp *\

 be

/* 0001_hello.c */ and /* 0001_hello.cpp */

?

 

From: Scott_R at: 2012-01-03 22:24:55

The numbering for the examples is off by one.

For example:

"10. Write a program to find the total and average marks of a student"

/* 11_stud.c */

From: Erica at: 2012-12-31 19:56:21

In 11_stud.c

avtg = total / 3;

should be

avg = total / 3;

Also the clrscr() function won't compile in g++. If others need you can add // to the start of the line and the line will become a comment.

From: Bob at: 2011-09-09 12:50:09

Ex 13 :

  if ( age >= 13 and age <= 19 ) printf("Teen Age");
  if ( age >= 20 and age <= 35 ) printf("Young Age");
  if ( age >= 36 and age < 50 ) printf("Middle Age");

should read as :

      if ( age >= 13 && age <= 19 ) printf("Teen Age");
      if ( age >= 20 && age <= 35 ) printf("Young Age");
      if ( age >= 36 && age < 50 ) printf("Middle Age");

From: Anonymous at: 2009-06-25 12:57:51

Example 14 would be less ....rectangular and much more triangular if, instead of

for (j=1;j<=5;j++)

one had

for (j=i; j<=5;j++)

From: Snehal at: 2009-06-15 07:00:15

In the difference between union and structure ,the names are misplaced ...means in union , structure points are placed and viceversa... Make it correct

From: bzero in c programming at: 2014-07-30 10:54:51

Hi,

There is a bug in the number 4 example. You will get compilation error while running this program you will get a compilation error like below:

 binaryover.cpp:31:11: error: expected ‘;’ before ‘t1’

binaryover.cpp:32:6: error: ‘t3’ was not declared in this scope

binaryover.cpp:32:11: error: ‘t1’ was not declared in this scope

binaryover.cpp:32:16: error: ‘t2’ was not declared in this scope

Because you are using "using namespace std;" but in the standard library there is a function named time (). So, to solve the problem, you can change the name of the function time ()  to any other name like time1 (), then you will be able to run your code without any error. 
 

From: Abhijeet at: 2009-01-11 01:25:52

Though i haven't done it myself, mingw32 can create win32 executables from linux. As its description says "Minimalist GNU win32 (cross) compiler, A Linux hosted, win32 target, cross compiler for C/C++, Freedom through obsolescence. Those who still really need to can now build windows executables from the comfort of Debian." You could check it out.

From: Paul at: 2009-01-07 22:40:39

Thanks, this is a nice tutorial, I'm actually a php programer and I saw a lot similar with php's language, but I have a question:

Can I compile a c++ program under linux to make a .exe to run on windows and viceversa?

And how to do that if it is possible?

From: dbrion at: 2009-06-30 11:58:40

"Can I compile a c++ program under linux to make a .exe to run on windows "

Yes :

I confirm the last post and cross compilers can natively be found with recent Fedora (and any linux distribution, messeems!) The way all the stuff necessary could be downloaded and made working can be found with adaptations of :

cran.r-project.org/doc/contrib/cross-build.pdf 

(one just has to stop at "make xtools": they are downloaded and put into a proper place).

Else, if you like linux and have "only"  Windows, you can use cygwin (avoids dualbooting or switching to another computer)  with the sources (it is very rare that sources need to be different between both systems, they use the same compiler -gcc/g+++- and almost the same include file names.... ) ...

 

"and viceversa"

No (not because linux executables do not have a .exe suffix!):

 but you can edit/compile/test your program(s) under cygwin (google search can find it) until it works and port it (i.E the source, the compilation  and test scripts) to Linux (there is almost no effort, apart the efforts linked with different disk nomenclatures, of course).

 Else, unless emulating linux with vmplayer/qemu/vbox -all these emulators are Windows ported-? but it is more complicated than C/C++....

From: Iftekhar Ahmed at: 2010-05-14 19:31:55

Dude........

Its relly helpful, I have 48 Hrs for my Exams..........................

Thanks for posting ............

Regards,

Iftekhar Ahmed