Overloading of shortened assignment operators +=, -=, *=, /=, %=. Examples
This topic is based on the following topics.
- Operator overloading in C++. Operator function. Keyword operator. Overload of basic arithmetic operators +, –, *, /. Examples of the implementation of built-in operator functions
- “Friendly” operator functions: differences, implementation. Overload of operators +, –, *, / with the help of friendly operator functions
Contents
- 1. Features of overloading of abbreviated assignment operators +=, -=, *=, /=, %=. The general form of the operator function
- 2. An example that demonstrates overloading the += operator for the class Integer, which implements an integer. The operator function is declared inside the class
- 3. An example that demonstrates overloading the %= operator for the Integer class, which implements an integer. The operator function is declared as a “friendly” to the class Integer
- 4. An example that demonstrates overloading the *= operator for the Complex class that implements a complex number. The operator function is implemented inside the class.
- 5. An example that demonstrates operator overloading *= for the Complex class that implements a complex number. The operator function is implemented as a “friendly” to the class
- 6. An example that demonstrates overloading the /= operator for an array of doubles. The operator function is implemented inside the class
- 7. An example that demonstrates overloading the /= operator for an array of doubles. Operator function implemented as “class-friendly”
- 8. An example that demonstrates several options for overloading the += operator for the Point class. The operator function operator+=() is overloaded and implemented inside the class
- Related topics
Search other websites:
1. Features of overloading of abbreviated assignment operators +=, -=, *=, /=, %=. The general form of the operator function
The shortened assignment operators +=, -=, *=, /=,%= are binary, that is, they require two operands for calculations.
If an operator function is implemented in a class, then it receives one operand and has the following general form
class ClassName { // ... // operator function that overloads one of the shortened assignment operators ClassName operator##(ClassName obj) { // ... } }
here
- ClassName – the name of the class for which the operator function operator##() is implemented;
- operator##() – some operator function. The ## symbols are replaced with the symbols +=, -=, *=, /=, %=, that is, the operator function will have the following names, respectively: operator+=(), operator-=(), operator*=(), operator/=(), operator%=().
- obj – instance (object) of class ClassName.
If the operator function is implemented as “friendly”, then it receives two operands. In this case, the general form of using an operator function is:
class ClassName { // ... // "friendly" operator function, // which overloads one of the shortened assignment operators friend ClassName operator##(ClassName& obj1, ClassName& obj2) { // ... } } // implementation of the "friendly" to the class ClassName operator function ClassName operator##(ClassName& obj1, ClassName& obj2) { // ... }
here obj1, obj2 – a reference to instances of the ClassName class, which are passed to the operator-friendly operator##() function.
⇑
2. An example that demonstrates overloading the += operator for the class Integer, which implements an integer. The operator function is declared inside the class
An Integer class is specified that implements operations on an integer value. The class declares:
- internal variable of integer type, which stores the value;
- two constructors;
- methods for accessing the integer variable number;
- operator function operator+=(), which overloads the shortened assignment operator +=.
The implementation of class Integer
// class Integer - implements an integer class Integer { private: int number; public: // class constructors Integer() { number = 0; } Integer(int _number) { number = _number; } // access methods int Get(void) { return number; } void Set(int _number) { number = _number; } // overloading of operator +=, operator function inside a class Integer operator+=(Integer obj) { number = number + obj.number; // access by reference return *this; } };
Using an instance (object) of the Integer class in another program code can be, for example, the following:
// overloading of shortened assignment operators +=, -=, etc. Integer d1(10), d2(18); // instances of the Integer class int t; // invoke the operator function operator+=() d1+=d2; // d1.number = d1.number + d2.number t = d1.Get(); // t = 28
According to this pattern, you can overload the other shortened assignment operators -=, *=, /=, %=.
⇑
3. An example that demonstrates overloading the %= operator for the Integer class, which implements an integer. The operator function is declared as a “friendly” to the class Integer
In the Integer class, the friend function operator%=() is declared. This function returns the remainder of the division of objects. Objects are the input parameters of the function.
// the Integer class that implements an integer class Integer { private: int number; public: // class constructors Integer() { number = 0; } Integer(int _number) { number = _number; } // access methods int Get(void) { return number; } void Set(int _number) { number = _number; } // declaration the "friendly" to the class Integer operator function // which overloads the operator%= friend Integer operator%=(Integer& obj1, Integer& obj2); }; // "friendly" operator function to the class Integer // the reference to the class Integer is passed to the operator function. Integer operator%=(Integer& obj1, Integer& obj2) { obj1.number = obj1.number % obj2.number; // access by reference return obj1; }
The use of the operator function operator%=() can be as follows
// overloading of shortened assignment operators +=, -=, etc. Integer d1(14), d2(6); // instances of the Integer class int t; // invoking the "friendly" operator function operator%=() d1 %= d2; // d1.number = d1.number + d2.number t = d1.Get(); // t = 2 Integer d3(9), d4(5); d3 %= d4; t = d3.Get(); // t = 4
⇑
4. An example that demonstrates overloading the *= operator for the Complex class that implements a complex number. The operator function is implemented inside the class.
The Complex class implements an operator function that overloads the *= operator. This function implements the multiplication of complex numbers according to the formula:
(a+bj)*(c+dj) = (a*c-b*d) + (a*d+b*c)j
Implementation of class Complex
class Complex { private: double real; // real part double imag; // imaginary part public: // class constructor Complex(double _real, double _imag) { real = _real; imag = _imag; } // access methods double GetReal(void) { return real; } double GetImag(void) { return imag; } void Set(double _real, double _imag) { real = _real; imag = _imag; } // operator function that overloads the operator *= // the function implements multiplication of complex numbers Complex operator*=(Complex obj) { double r; double i; r = real*obj.real - imag*obj.imag; i = real*obj.imag + obj.real*imag; real = r; imag = i; return *this; } };
Demonstration of using the operator function
// Overloading the shortened operator *= Complex c1(2,3); // 2+3j Complex c2(-1,1); // -1+j double t; // invoking the operator function *= c1 *= c2; // c1 = -5-1j t = c1.GetReal(); // t = -5 t = c1.GetImag(); // t = -1
⇑
5. An example that demonstrates operator overloading *= for the Complex class that implements a complex number. The operator function is implemented as a “friendly” to the class
The example implements the operation of multiplying complex numbers using the “friend” operator function operator*=(). The “friendly” operator function receives 2 parameters.
class Complex { private: double real; // real part double imag; // imaginary part public: // class constructor Complex(double _real, double _imag) { real = _real; imag = _imag; } // access methods double GetReal(void) { return real; } double GetImag(void) { return imag; } void Set(double _real, double _imag) { real = _real; imag = _imag; } // declaration of "friendly" function friend Complex operator*=(Complex& c1, Complex& c2); }; // implementation of the "class-friendly" function to the Complex class Complex operator*=(Complex& c1, Complex& c2) { double r; double i; r = c1.real * c2.real - c1.imag * c2.imag; i = c1.real * c2.imag + c1.imag * c2.real; c1.real = r; c1.imag = i; return c1; }
Using the Complex class in another method can be as follows:
// Overload the shortened operator *= Complex c1(3,-2); // 3-2j Complex c2(1,-1); // 1-j double t; // invoke the operator function *= c1 *= c2; t = c1.GetReal(); // t = -1 t = c1.GetImag(); // t = -5
⇑
6. An example that demonstrates overloading the /= operator for an array of doubles. The operator function is implemented inside the class.
The ArrayDouble class implements an array of doubles. Operator function operator/=() implements the element-wise division of two arrays
// a fixed array of type double class ArrayDouble { private: double D[10]; // array public: // constructor ArrayDouble() { for (int i=0; i<10; i++) D[i] = 0; } // access methods double Get(int index) { if ((index>=0)&&(index<10)) return D[index]; return 0.0; } void Set(int index, double value) { if ((index>=0)&&(index<10)) D[index] = value; } // operator function, elementwise divides two arrays ArrayDouble operator/=(ArrayDouble AD) { // elementwise division of the current array into an array of AD for (int i=0; i<10; i++) D[i] = D[i] / AD.Get(i); return *this; } };
Using the ArrayDoble class can be as follows
// Overloading of shortened operator *= ArrayDouble A1; ArrayDouble A2; double t; // arrays forming for (int i=0; i<10; i++) A1.Set(i,10); // A1 = {10,10,10,10,10,10,10,10,10,10} for (int i=0; i<10; i++) // A2 = {1,2,3,4,5,6,7,8,9,10} A2.Set(i, i+1); // invoke the operator function A1 /= A2; // checking t = A1.Get(0); // t = 10/1 = 10.0 t = A1.Get(1); // t = 10/2 = 5.0 t = A1.Get(2); // t = 10/3 = 3.33333333 t = A1.Get(7); // t = 10/8 = 1.25
⇑
7. An example that demonstrates overloading the /= operator for an array of doubles. Operator function implemented as “class-friendly”
In the ArrayDouble class, a “friendly” operator function is declared that implements elementwise division of arrays. Declaring class ArrayDouble and operator function is as follows
// fixed array of type double class ArrayDouble { private: double D[10]; // array public: // constructor ArrayDouble() { for (int i=0; i<10; i++) D[i] = 0; } // access methods double Get(int index) { if ((index>=0)&&(index<10)) return D[index]; return 0.0; } void Set(int index, double value) { if ((index>=0)&&(index<10)) D[index] = value; } // declaration of "friendly" operator functions friend ArrayDouble operator/=(ArrayDouble& AD1, ArrayDouble& AD2); }; // implementation of the class-friendly ArrayDouble operator function ArrayDouble operator/=(ArrayDouble& AD1, ArrayDouble& AD2) { for (int i=0; i<10; i++) AD1.D[i] = AD1.D[i] / AD2.D[i]; return AD1; }
Using a class in another program code
// Overloading of shortened operator *= ArrayDouble A1; ArrayDouble A2; double t; // arrays forming for (int i=0; i<10; i++) A1.Set(i,10); // A1 = {10,10,10,10,10,10,10,10,10,10} for (int i=0; i<10; i++) // A2 = {1,2,3,4,5,6,7,8,9,10} A2.Set(i, i+1); // invoke the "friendly" operator functions A1 /= A2; // checking t = A1.Get(0); // t = 10/1 = 10.0 t = A1.Get(1); // t = 10/2 = 5.0 t = A1.Get(2); // t = 10/3 = 3.33333333 t = A1.Get(7); // t = 10/8 = 1.25
⇑
8. An example that demonstrates several options for overloading the += operator for the Point class. The operator function operator+=() is overloaded and implemented inside the class
Operator function in the class can be overloaded. Such functions must contain the same number of parameters, but these parameters must be of different types.
// A class that implements a point on the coordinate plane // class contains two overloaded operator functions operator+=() class Point { private: int x, y; // coordinates of a point public: // class constructors Point() { x = y = 0; } Point(int nx, int ny) { x = nx; y = ny; } // methods of access to class members int GetX(void) { return x; } int GetY(void) { return y; } void SetX(int nx) { x = nx; } void Set(int ny) { y = ny; } // operator function '+=' // which sums the two points Point operator+=(Point pt) { x = x + pt.x; y = y + pt.y; return *this; } // operator functions '+=' // which increases x and y by the value of the input parameter d Point operator+=(int d) { x = x + d; y = y + d; return *this; } };
In the above code, there are two operator functions operator+=() that overload the operator +=.
Point operator+=(Point pt) { // ... } Point operator+=(int d) { // ... }
The following demonstrates the use of the class Point operator functions.
// overloading the shortened operatror += Point p1(2,3); Point p2(4,5); int x, y; // invoke the operator function of summation of instances of type Point p1 += p2; // checking x = p1.GetX(); // x = 2+4 = 6 y = p1.GetY(); // y = 3+5 = 8 p2 += p1; x = p2.GetX(); // x = 6+4 = 10 y = p2.GetY(); // y = 8+5 = 13 // invoke the operator function of summation Point + int p1 += 10; x = p1.GetX(); // x = 6+10 = 16 y = p1.GetY(); // y = 8+10 = 18 // Point p3(5,5); p3+=-7; x = p3.GetX(); // x = -2 y = p3.GetY(); // y = -2
⇑
Related topics
- Operator overloading in C++. Operator function. Keyword operator. Overload of basic arithmetic operators +, –, *, /. Examples of the implementation of built-in operator functions
- “Friendly” operator functions: differences, implementation. Overload of operators +, –, *, / with the help of friendly operator functions
- Overloading increment and decrement operators ++, – –. Examples