SlideShare una empresa de Scribd logo
1 de 3
Descargar para leer sin conexión
Object Oriented Programming                       License: http://creativecommons.org/licenses/by-nc-nd/3.0/    Object Oriented Programming

                                                                                                                                                          Limitations
                                         Operator Overloading
                                                                                                                     • You can’t overload operators that don’t already exist in C++.
                                                                                                                       You can’t make up a ** operator for (say) exponentiation.
     It is possible to overload the built-in C++ operators such as +, >=, and ++ so                                    You can overload only the built-in operators.
     that they invoke different functions, depending on their operands.
                                                                                                                     Even a few of these, such as the dot operator (.), the scope resolution
     That is, the + in a+b will call one function if a and b are integers, but will                                  operator (::), the conditional operator (?:), and sizeof, can’t be overloaded.
     call a different function if a and b are objects of a class you’ve created.
                                                                                                                     • The C++ operators can be divided roughly into binary and unary.
    Overloading doesn’t actually add any capabilities to C++. Everything you can do                                  Binary operators take two arguments. Examples are a+b, a-b, a/b, and so on.
    with an overloaded operator you can also do with a function.                                                     Unary operators take only one argument: -a, ++a, a--.
    However, overloaded operators make your programs easier to write, read,                                          If a built-in operator is binary, then all overloads of it remain binary. It is also
    understand and maintain.                                                                                         true for unary operators.
                                                                                                                     • Operator precedence and syntax (number of arguments) cannot be changed
   Operator overloading is only another way of calling a function.                                                   through overloading. For example operator * has always higher precedence
   Looking at it this way, you have no reason to overload an operator except if it                                   than operator +.
   will make the code involving your class easier to write and especially easier to                                  • All the operators used in expressions that contain only built-in data types
   read.                                                                                                             cannot be changed. For example you can never overload operator ‘+’ for
   Remember, code is read much more than it is written.                                                              integers so that a = 1 + 7; behaves differently.
                                                                                                                     At least one operand must be of a user defined type (class).

 http://www.faculty.itu.edu.tr/buzluca                                 ©1999-2010 Dr. Feza BUZLUCA        5.1    http://www.faculty.itu.edu.tr/buzluca                          ©1999-2010 Dr. Feza BUZLUCA        5.2
 http://www.buzluca.info                                                                                         http://www.buzluca.info




Object Oriented Programming                                                                                     Object Oriented Programming

               Overloading the + operator for ComplexT objects                                                                                  Overloading the Assignment Operator (=)
   // A class to define complex numbers
   class ComplexT{                                                                                                  Because assigning an object to another object of the same type is an activity
      double re, im;                                                                                                most people expect to be possible, the compiler will automatically create a
     public:                                                                                                        type::operator=(const type &) if you don’t make one.
             :                                                      // Member functions
                                                                                                                    The behavior of this operator is member wise assignment. It assigns (copies)
      ComplexT operator+(const ComplexT&) const;                    // prototype of operator+ function
   };                                                                                                               each member of an object to members of another object.
                                                                                                                    If this operation is sufficient you don't need to overload the assignment
   // The Body of the function for operator +
                                                                                                                    operator.
   ComplexT ComplexT::operator+(const ComplexT& z) const
   {                                                                                                                For example, overloading of assignment operator for complex numbers is not
      double re_new, im_new;                                                                                        necessary.
      re_new = re + z.re;                                                                                           void ComplexT::operator=(const ComplexT& z)       // unnecessary
      im_new = im + z.im;
                                                                                                                    {
      return ComplexT(re_new, im_new); // constructor ComplexT(double,double) is needed
                                                                                                                       re = z.re;            // Member wise assignment
   }
                                                                                                                       im = z.im;
   int main()                                                                    See Example: e51.cpp               }
   {
       ComplexT z1(1,1), z2(2,2) , z3;
                                                                                                                    You don't need to write such an assignment operator function, because the
        :                                                   // Other operations                                     operator provided by the compiler does the same thing.
       z3 = z1 + z2;                                        // like   z3 = z1.operator+(z2);                                                                                      See Example: e52.cpp
 http://www.faculty.itu.edu.tr/buzluca                                 ©1999-2010 Dr. Feza BUZLUCA        5.3    http://www.faculty.itu.edu.tr/buzluca                          ©1999-2010 Dr. Feza BUZLUCA        5.4
 http://www.buzluca.info                                                                                         http://www.buzluca.info




Object Oriented Programming                                                                                     Object Oriented Programming


      With classes of any sophistication (especially if they contain pointers!) you                                                                  Operator, provided by the compiler:
      have to explicitly create an operator=.
                                                                                                                               Source object                                         Destination object
      Example, the String class:                         size                                                     size:                     8                                                 3
                                                                                                                                                                                              8          size
     class String{                                    *contents            t e x t 0
        int size;                                                                                                 contents: 0x008d0080                                                0x00185d12
                                                                                                                                                                                      0x008d0080         contents
        char *contents;
      public:                                                                                                                                                                                            X
        void operator=(const String &);                       // assignment operator                                                                       s                                                   a
        :                                                     // Other methods                                                                             t                                                   b
     };                                                                                                                                                    r                                                   c
                                                                                                                                                           i                                                  0
    void String::operator=(const String &in_object)                                                                                                        n
    {                                                                                                                                                      g                                 Data is still wasting
      if (size != in_object.size){          // if the sizes of the source and destination                                                                                                    memory space.
          size = in_object.size;            // objects are different                                                                                       1
          delete [] contents;                // The old contents is deleted                                                                               0
          contents = new char[size+1];       // Memory allocation for the new contents
      }
      strcpy(contents, in_object.contents); // not a memberwise assignment
    }
 http://www.faculty.itu.edu.tr/buzluca                                 ©1999-2010 Dr. Feza BUZLUCA        5.5    http://www.faculty.itu.edu.tr/buzluca                          ©1999-2010 Dr. Feza BUZLUCA        5.6
 http://www.buzluca.info                                                                                         http://www.buzluca.info




                                                                                                                                                                                                                         1
Object Oriented Programming                    License: http://creativecommons.org/licenses/by-nc-nd/3.0/     Object Oriented Programming

                                                                                                                      Return value of the assignment operator function
                                Operator of the programmer:                                                     When there’s a void return value, as shown in the previous example, you can’t
                                                                                                                chain the assignment operator (as in a = b = c ).
                                                                                                                To fix this, the assignment operator must return a reference to the object
          Source object                                                 Destination object                      that called the operator function (its address).
size:                    8                                                       3
                                                                                 8            size               // Assignment operator , can be chained as in a = b = c
                                                                                                                 const String& String::operator=(const String &in_object)
contents: 0x008d0080                                                      0x00185d12
                                                                          0x00ef0080          contents           {
                                                                                                                     if (size != in_object.size){         // if the sizes of the source and destination
                                                                                                                        size = in_object.size;            // objects are different


                                                                                              X
                                         s                      s                                  a
                                                                                                                        delete [] contents;                // The old contents is deleted
                                         t                      t                                  b
                                                                                                                        contents = new char[size+1];       // Memory allocation for the new contents
                                         r                      r                                  c
                                                                                                                    }
                                         i                      i                                 0                                                                      See Example: e53.cpp
                                                                                                                    strcpy(contents, in_object.contents);
                                         n                      n                                                   return *this;                           // returns a reference to the object
                                         g                      g                                                }
                                          1                     1                                               The difference between the assignment operator and the copy constructor is
                                         0                    0                                               that the copy constructor actually creates a new object before copying data
                                                                                                                from another object into it,
                                                                                                                whereas the assignment operator copies data into an already existing object.
 http://www.faculty.itu.edu.tr/buzluca                              ©1999-2010 Dr. Feza BUZLUCA         5.7    http://www.faculty.itu.edu.tr/buzluca                    ©1999-2010 Dr. Feza BUZLUCA    5.8
 http://www.buzluca.info                                                                                       http://www.buzluca.info




Object Oriented Programming                                                                                   Object Oriented Programming

                     Overloading the Subscript Operator ”[ ]”                                                  Example: Overloading of the subscript operator for the String class.
     Same rules apply to all operators. So we don’t need to discuss each operator.                             The operator will be used to access the ith character of the string.
     However, we will examine some interesting operators.                                                      If i is less the zero then the first character and if i is greater than the size of
     One of the interesting operators is the subscript operator.                                               the string the last character will be accessed.
     It is declared usually, in two different ways:                                                             // Subscript operator
                                                                                                                char & String::operator[](int i)
   class C{
                                                                                                                {
        returntype & operator [] (paramtype);    // for the left side of an assignment                              if(i < 0)
           or                                                                                                          return contents[0];                      // return first character
        const returntype & operator [] (paramtype) const; // for the right side                                     if(i >= size)
   };                                                                                                                  return contents[size-1];                 // return last character
  The first declaration can be used when the overloaded subscript operator                                          return contents[i];                         // return i th character
  modifies the object.                                                                                          }
                                                                                                                int main()
  The second declaration is used with a const object; in this case, the overloaded
                                                                                                                {
  subscript operator can access but not modify the object.
                                                                                                                    String s1("String 1");
        If c is an object of class C, the expression                                                                s1[1] = 'p';                                // modifies an element of the contents
        c[i];                                                                                                       s1.print();
                                                                                                                    cout << " 5 th character of the string s1 is: " << s1[5] << endl;
        is interpreted as                                                                                           return 0;
        c.operator[ ](i);                                                                                       }                                                             See Example: e54.cpp

 http://www.faculty.itu.edu.tr/buzluca                              ©1999-2010 Dr. Feza BUZLUCA         5.9    http://www.faculty.itu.edu.tr/buzluca                    ©1999-2010 Dr. Feza BUZLUCA   5.10
 http://www.buzluca.info                                                                                       http://www.buzluca.info




Object Oriented Programming                                                                                   Object Oriented Programming

                              Overloading the Function Call Operator ( )                                         Example: The function call operator is overloaded to copy a part of the contents
                                                                                                                 of a string into a given memory location.
    The function call operator is unique in that it allows any number of arguments.                              In this example the function call operator takes two arguments: the address of
     class C{                                                                                                    the destination memory and the numbers of characters to copy.
          returntype operator ( ) (paramtypes);                                                                   // The function call operator with two arguments
     };                                                                                                           void String::operator( )( char * dest, int num) const
                                                                                                                  {
    If c is an object of class C, the expression                                                                     if (num > size) num=size;                // if num is greater the size of the string
    c(i, j, k);                                                                                                      for (int k=0; k < num; k++) dest[k]=contents[k];
                                                                                                                  }
    is interpreted as
                                                                                                                   // ----- Main function -----                   Is this statement
    c.operator( )( i, j, k );
                                                                                                                   int main( )                                    understandable??
    Example: The function call operator is overloaded to print complex numbers on                                  {
    the screen. In this example the function call operator does not take any                                          String s1("Example Program");
    arguments.                                                                                                        char * c = new char[8];              // Destination memory
                                                                                                                      s1(c,7);                             // First 7 letters of string1 are copied into c
 // The function call operator without any argument, it prints a complex number                                       c[7] = '0';                         // End of string (null) character
 void ComplexT::operator( )( ) const                                                                                  cout << c;
 {                                                                                                                    delete [] c;
                                                         See Example: e55.cpp
    cout << re << " , " << im << endl ;                                                                               return 0;                                            See Example: e56.cpp
 }                                                                                                                 }
 http://www.faculty.itu.edu.tr/buzluca                              ©1999-2010 Dr. Feza BUZLUCA        5.11    http://www.faculty.itu.edu.tr/buzluca                    ©1999-2010 Dr. Feza BUZLUCA   5.12
 http://www.buzluca.info                                                                                       http://www.buzluca.info




                                                                                                                                                                                                             2
Object Oriented Programming                            License: http://creativecommons.org/licenses/by-nc-nd/3.0/    Object Oriented Programming

                          Overloading Unary Operators
  Unary operators operate on a single operand. Examples are the increment (++)                                               To be able to assign the incremented value to a new object, the operator
  and decrement (--) operators; the unary minus, as in -5; and the logical not (!)                                           function must return a reference to the object.
  operator.
 Unary operators take no arguments, they operate on the object for which they
                                                                                                                       // ++ operator
 were called.
                                                                                                                       // increments the real part of a complex number by 0.1
 Normally, this operator appears on the left side of the object, as in !obj, -obj,                                     const ComplexT & ComplexT::operator++()
 and ++obj.                                                                                                            {
 Example: We define ++ operator for class ComplexT to increment the real part                                              re=re+0.1;
 of the complex number by 0.1 .                                                                                            return *this;
          void ComplexT::operator++()                                                                                  }
          {
              re=re+0.1;                                                                                               int main()
          }                                                                                                            {
                int main()                                                                                                ComplexT z1(1.2, 0.5), z2;
                {                                                                                                         z2 = ++z1;                 // ++ operator is called, incremented value is assigned to z2
                   ComplexT z(1.2, 0.5);                                                                                  z2.print();
                   ++z;                                         // z.operator++()                                         return 0;
                   z.print();                                                                                          }                                                     See Example: e57.cpp
                   return 0;
                }
 http://www.faculty.itu.edu.tr/buzluca                                      ©1999-2010 Dr. Feza BUZLUCA       5.13    http://www.faculty.itu.edu.tr/buzluca                     ©1999-2010 Dr. Feza BUZLUCA      5.14
 http://www.buzluca.info                                                                                              http://www.buzluca.info




Object Oriented Programming                                                                                          Object Oriented Programming

                 "Pre" and "post" form of operators ++ and --                                                          SUMMARY:
  Recall that ++ and -- operators come in a "pre" and "post" form. If these                                            Benefits of Classes student person                                        class Person{
                                                                                                                                                                                                 ¨¨¨¨¨¨¨¨¨¨
  operators are used with an assignment statement than different forms have                                                                                                                      ¨¨¨¨¨¨¨¨¨¨¨
  different meanings.                                                                                                                                                                            };
                                                                                                                                                               object
  z2= ++ z1;              // preincrement
                                                                                                                                                                worker
  z2 = z1++;              // postincrement
  The declaration, operator ++ ( ) with no parameters overloads the preincrement                                                                              REAL WORLD                    COMPUTER (MODEL)
  operator.
                                                                                                                        • Object-oriented programming gives us a natural and intuitive way to view the
  The declaration, operator ++ (int) with a single int parameter overloads the
                                                                                                                        programming, namely by modeling real-world objects.
  postincrement operator. Here, the int parameter serves to distinguish the
  postincrement form from the preincrement form. This parameter is not used.                                            There is a one to one relation between objects in the real world and objects in
                                                                                                                        the program.
  ComplexT ComplexT::operator++(int)                            // postincrement operator                               • Programs are easy to read and understand. The data and functions of an object
  {                                                                                                                     are intimately tied together.
    ComplexT temp;                                                                                                      • Information hiding: Objects know how to communicate with other objects. But
    temp = *this;                                               // old value (original object)                          objects normally are not allowed to know how other objects are implemented.
    re= re + 0.1;                                               // increment the real part                              This property prevents data corruption. It is easy to find errors.
    return temp;                                                 // return old value
  }                                                                                                                     • Objects are active data structures. They can receive messages and perform
                                         See Example: e58.cpp                                                           some actions according to these messages.

 http://www.faculty.itu.edu.tr/buzluca                                      ©1999-2010 Dr. Feza BUZLUCA       5.15    http://www.faculty.itu.edu.tr/buzluca                     ©1999-2010 Dr. Feza BUZLUCA      5.16
 http://www.buzluca.info                                                                                              http://www.buzluca.info




                                                                                                                                                                                                                        3

Más contenido relacionado

La actualidad más candente

Aae oop xp_08
Aae oop xp_08Aae oop xp_08
Aae oop xp_08
Niit Care
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
Kumar
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
farhan amjad
 

La actualidad más candente (20)

14 operator overloading
14 operator overloading14 operator overloading
14 operator overloading
 
Operator overloading
Operator overloading Operator overloading
Operator overloading
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Aae oop xp_08
Aae oop xp_08Aae oop xp_08
Aae oop xp_08
 
Polymorphism Using C++
Polymorphism Using C++Polymorphism Using C++
Polymorphism Using C++
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Operator overloading in C++
Operator overloading in C++Operator overloading in C++
Operator overloading in C++
 
Java modular extension for operator overloading
Java modular extension for operator overloadingJava modular extension for operator overloading
Java modular extension for operator overloading
 
Operator overloading and type conversion in cpp
Operator overloading and type conversion in cppOperator overloading and type conversion in cpp
Operator overloading and type conversion in cpp
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
operator overloading in C++
operator overloading in C++operator overloading in C++
operator overloading in C++
 
operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++operator overloading & type conversion in cpp over view || c++
operator overloading & type conversion in cpp over view || c++
 
Rjb
RjbRjb
Rjb
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Pointers,virtual functions and polymorphism cpp
Pointers,virtual functions and polymorphism cppPointers,virtual functions and polymorphism cpp
Pointers,virtual functions and polymorphism cpp
 
Static and dynamic polymorphism
Static and dynamic polymorphismStatic and dynamic polymorphism
Static and dynamic polymorphism
 
Operator overloading and type conversions
Operator overloading and type conversionsOperator overloading and type conversions
Operator overloading and type conversions
 
OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++OPERATOR OVERLOADING IN C++
OPERATOR OVERLOADING IN C++
 
pointers,virtual functions and polymorphism
pointers,virtual functions and polymorphismpointers,virtual functions and polymorphism
pointers,virtual functions and polymorphism
 
Polymorphism in C++
Polymorphism in C++Polymorphism in C++
Polymorphism in C++
 

Destacado (9)

Inheritance
InheritanceInheritance
Inheritance
 
Oop06 6
Oop06 6Oop06 6
Oop06 6
 
Oop03 6
Oop03 6Oop03 6
Oop03 6
 
Oop07 6
Oop07 6Oop07 6
Oop07 6
 
Oop04 6
Oop04 6Oop04 6
Oop04 6
 
Oop01 6
Oop01 6Oop01 6
Oop01 6
 
Oop09 6
Oop09 6Oop09 6
Oop09 6
 
Oop10 6
Oop10 6Oop10 6
Oop10 6
 
Oop02 6
Oop02 6Oop02 6
Oop02 6
 

Similar a Oop05 6

Lec 28 - operator overloading
Lec 28 - operator overloadingLec 28 - operator overloading
Lec 28 - operator overloading
Princess Sam
 
Lec 26.27-operator overloading
Lec 26.27-operator overloadingLec 26.27-operator overloading
Lec 26.27-operator overloading
Princess Sam
 

Similar a Oop05 6 (20)

Operator Overloading in C++
Operator Overloading in C++Operator Overloading in C++
Operator Overloading in C++
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
Lec 28 - operator overloading
Lec 28 - operator overloadingLec 28 - operator overloading
Lec 28 - operator overloading
 
Oops
OopsOops
Oops
 
Ch-4-Operator Overloading.pdf
Ch-4-Operator Overloading.pdfCh-4-Operator Overloading.pdf
Ch-4-Operator Overloading.pdf
 
Lec 26.27-operator overloading
Lec 26.27-operator overloadingLec 26.27-operator overloading
Lec 26.27-operator overloading
 
OOP_UnitIII.pdf
OOP_UnitIII.pdfOOP_UnitIII.pdf
OOP_UnitIII.pdf
 
Operator overloaing
Operator overloaingOperator overloaing
Operator overloaing
 
B.sc CSIT 2nd semester C++ Unit4
B.sc CSIT  2nd semester C++ Unit4B.sc CSIT  2nd semester C++ Unit4
B.sc CSIT 2nd semester C++ Unit4
 
overloading in C++
overloading in C++overloading in C++
overloading in C++
 
Overloading
OverloadingOverloading
Overloading
 
Operator Overloading and Scope of Variable
Operator Overloading and Scope of VariableOperator Overloading and Scope of Variable
Operator Overloading and Scope of Variable
 
Operator overloading
Operator overloadingOperator overloading
Operator overloading
 
NIKUL SURANI
NIKUL SURANINIKUL SURANI
NIKUL SURANI
 
Unary operator overloading
Unary operator overloadingUnary operator overloading
Unary operator overloading
 
3d7b7 session4 c++
3d7b7 session4 c++3d7b7 session4 c++
3d7b7 session4 c++
 
OOPS-Seminar.pdf
OOPS-Seminar.pdfOOPS-Seminar.pdf
OOPS-Seminar.pdf
 
Binary operator overloading
Binary operator overloadingBinary operator overloading
Binary operator overloading
 
3. Polymorphism.pptx
3. Polymorphism.pptx3. Polymorphism.pptx
3. Polymorphism.pptx
 
Interoduction to c++
Interoduction to c++Interoduction to c++
Interoduction to c++
 

Oop05 6

  • 1. Object Oriented Programming License: http://creativecommons.org/licenses/by-nc-nd/3.0/ Object Oriented Programming Limitations Operator Overloading • You can’t overload operators that don’t already exist in C++. You can’t make up a ** operator for (say) exponentiation. It is possible to overload the built-in C++ operators such as +, >=, and ++ so You can overload only the built-in operators. that they invoke different functions, depending on their operands. Even a few of these, such as the dot operator (.), the scope resolution That is, the + in a+b will call one function if a and b are integers, but will operator (::), the conditional operator (?:), and sizeof, can’t be overloaded. call a different function if a and b are objects of a class you’ve created. • The C++ operators can be divided roughly into binary and unary. Overloading doesn’t actually add any capabilities to C++. Everything you can do Binary operators take two arguments. Examples are a+b, a-b, a/b, and so on. with an overloaded operator you can also do with a function. Unary operators take only one argument: -a, ++a, a--. However, overloaded operators make your programs easier to write, read, If a built-in operator is binary, then all overloads of it remain binary. It is also understand and maintain. true for unary operators. • Operator precedence and syntax (number of arguments) cannot be changed Operator overloading is only another way of calling a function. through overloading. For example operator * has always higher precedence Looking at it this way, you have no reason to overload an operator except if it than operator +. will make the code involving your class easier to write and especially easier to • All the operators used in expressions that contain only built-in data types read. cannot be changed. For example you can never overload operator ‘+’ for Remember, code is read much more than it is written. integers so that a = 1 + 7; behaves differently. At least one operand must be of a user defined type (class). http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.1 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.2 http://www.buzluca.info http://www.buzluca.info Object Oriented Programming Object Oriented Programming Overloading the + operator for ComplexT objects Overloading the Assignment Operator (=) // A class to define complex numbers class ComplexT{ Because assigning an object to another object of the same type is an activity double re, im; most people expect to be possible, the compiler will automatically create a public: type::operator=(const type &) if you don’t make one. : // Member functions The behavior of this operator is member wise assignment. It assigns (copies) ComplexT operator+(const ComplexT&) const; // prototype of operator+ function }; each member of an object to members of another object. If this operation is sufficient you don't need to overload the assignment // The Body of the function for operator + operator. ComplexT ComplexT::operator+(const ComplexT& z) const { For example, overloading of assignment operator for complex numbers is not double re_new, im_new; necessary. re_new = re + z.re; void ComplexT::operator=(const ComplexT& z) // unnecessary im_new = im + z.im; { return ComplexT(re_new, im_new); // constructor ComplexT(double,double) is needed re = z.re; // Member wise assignment } im = z.im; int main() See Example: e51.cpp } { ComplexT z1(1,1), z2(2,2) , z3; You don't need to write such an assignment operator function, because the : // Other operations operator provided by the compiler does the same thing. z3 = z1 + z2; // like z3 = z1.operator+(z2); See Example: e52.cpp http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.3 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.4 http://www.buzluca.info http://www.buzluca.info Object Oriented Programming Object Oriented Programming With classes of any sophistication (especially if they contain pointers!) you Operator, provided by the compiler: have to explicitly create an operator=. Source object Destination object Example, the String class: size size: 8 3 8 size class String{ *contents t e x t 0 int size; contents: 0x008d0080 0x00185d12 0x008d0080 contents char *contents; public: X void operator=(const String &); // assignment operator s a : // Other methods t b }; r c i 0 void String::operator=(const String &in_object) n { g Data is still wasting if (size != in_object.size){ // if the sizes of the source and destination memory space. size = in_object.size; // objects are different 1 delete [] contents; // The old contents is deleted 0 contents = new char[size+1]; // Memory allocation for the new contents } strcpy(contents, in_object.contents); // not a memberwise assignment } http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.5 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.6 http://www.buzluca.info http://www.buzluca.info 1
  • 2. Object Oriented Programming License: http://creativecommons.org/licenses/by-nc-nd/3.0/ Object Oriented Programming Return value of the assignment operator function Operator of the programmer: When there’s a void return value, as shown in the previous example, you can’t chain the assignment operator (as in a = b = c ). To fix this, the assignment operator must return a reference to the object Source object Destination object that called the operator function (its address). size: 8 3 8 size // Assignment operator , can be chained as in a = b = c const String& String::operator=(const String &in_object) contents: 0x008d0080 0x00185d12 0x00ef0080 contents { if (size != in_object.size){ // if the sizes of the source and destination size = in_object.size; // objects are different X s s a delete [] contents; // The old contents is deleted t t b contents = new char[size+1]; // Memory allocation for the new contents r r c } i i 0 See Example: e53.cpp strcpy(contents, in_object.contents); n n return *this; // returns a reference to the object g g } 1 1 The difference between the assignment operator and the copy constructor is 0 0 that the copy constructor actually creates a new object before copying data from another object into it, whereas the assignment operator copies data into an already existing object. http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.7 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.8 http://www.buzluca.info http://www.buzluca.info Object Oriented Programming Object Oriented Programming Overloading the Subscript Operator ”[ ]” Example: Overloading of the subscript operator for the String class. Same rules apply to all operators. So we don’t need to discuss each operator. The operator will be used to access the ith character of the string. However, we will examine some interesting operators. If i is less the zero then the first character and if i is greater than the size of One of the interesting operators is the subscript operator. the string the last character will be accessed. It is declared usually, in two different ways: // Subscript operator char & String::operator[](int i) class C{ { returntype & operator [] (paramtype); // for the left side of an assignment if(i < 0) or return contents[0]; // return first character const returntype & operator [] (paramtype) const; // for the right side if(i >= size) }; return contents[size-1]; // return last character The first declaration can be used when the overloaded subscript operator return contents[i]; // return i th character modifies the object. } int main() The second declaration is used with a const object; in this case, the overloaded { subscript operator can access but not modify the object. String s1("String 1"); If c is an object of class C, the expression s1[1] = 'p'; // modifies an element of the contents c[i]; s1.print(); cout << " 5 th character of the string s1 is: " << s1[5] << endl; is interpreted as return 0; c.operator[ ](i); } See Example: e54.cpp http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.9 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.10 http://www.buzluca.info http://www.buzluca.info Object Oriented Programming Object Oriented Programming Overloading the Function Call Operator ( ) Example: The function call operator is overloaded to copy a part of the contents of a string into a given memory location. The function call operator is unique in that it allows any number of arguments. In this example the function call operator takes two arguments: the address of class C{ the destination memory and the numbers of characters to copy. returntype operator ( ) (paramtypes); // The function call operator with two arguments }; void String::operator( )( char * dest, int num) const { If c is an object of class C, the expression if (num > size) num=size; // if num is greater the size of the string c(i, j, k); for (int k=0; k < num; k++) dest[k]=contents[k]; } is interpreted as // ----- Main function ----- Is this statement c.operator( )( i, j, k ); int main( ) understandable?? Example: The function call operator is overloaded to print complex numbers on { the screen. In this example the function call operator does not take any String s1("Example Program"); arguments. char * c = new char[8]; // Destination memory s1(c,7); // First 7 letters of string1 are copied into c // The function call operator without any argument, it prints a complex number c[7] = '0'; // End of string (null) character void ComplexT::operator( )( ) const cout << c; { delete [] c; See Example: e55.cpp cout << re << " , " << im << endl ; return 0; See Example: e56.cpp } } http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.11 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.12 http://www.buzluca.info http://www.buzluca.info 2
  • 3. Object Oriented Programming License: http://creativecommons.org/licenses/by-nc-nd/3.0/ Object Oriented Programming Overloading Unary Operators Unary operators operate on a single operand. Examples are the increment (++) To be able to assign the incremented value to a new object, the operator and decrement (--) operators; the unary minus, as in -5; and the logical not (!) function must return a reference to the object. operator. Unary operators take no arguments, they operate on the object for which they // ++ operator were called. // increments the real part of a complex number by 0.1 Normally, this operator appears on the left side of the object, as in !obj, -obj, const ComplexT & ComplexT::operator++() and ++obj. { Example: We define ++ operator for class ComplexT to increment the real part re=re+0.1; of the complex number by 0.1 . return *this; void ComplexT::operator++() } { re=re+0.1; int main() } { int main() ComplexT z1(1.2, 0.5), z2; { z2 = ++z1; // ++ operator is called, incremented value is assigned to z2 ComplexT z(1.2, 0.5); z2.print(); ++z; // z.operator++() return 0; z.print(); } See Example: e57.cpp return 0; } http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.13 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.14 http://www.buzluca.info http://www.buzluca.info Object Oriented Programming Object Oriented Programming "Pre" and "post" form of operators ++ and -- SUMMARY: Recall that ++ and -- operators come in a "pre" and "post" form. If these Benefits of Classes student person class Person{ ¨¨¨¨¨¨¨¨¨¨ operators are used with an assignment statement than different forms have ¨¨¨¨¨¨¨¨¨¨¨ different meanings. }; object z2= ++ z1; // preincrement worker z2 = z1++; // postincrement The declaration, operator ++ ( ) with no parameters overloads the preincrement REAL WORLD COMPUTER (MODEL) operator. • Object-oriented programming gives us a natural and intuitive way to view the The declaration, operator ++ (int) with a single int parameter overloads the programming, namely by modeling real-world objects. postincrement operator. Here, the int parameter serves to distinguish the postincrement form from the preincrement form. This parameter is not used. There is a one to one relation between objects in the real world and objects in the program. ComplexT ComplexT::operator++(int) // postincrement operator • Programs are easy to read and understand. The data and functions of an object { are intimately tied together. ComplexT temp; • Information hiding: Objects know how to communicate with other objects. But temp = *this; // old value (original object) objects normally are not allowed to know how other objects are implemented. re= re + 0.1; // increment the real part This property prevents data corruption. It is easy to find errors. return temp; // return old value } • Objects are active data structures. They can receive messages and perform See Example: e58.cpp some actions according to these messages. http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.15 http://www.faculty.itu.edu.tr/buzluca ©1999-2010 Dr. Feza BUZLUCA 5.16 http://www.buzluca.info http://www.buzluca.info 3