Operator overloading in C ++

I recently learned about operator overloading in C ++. When you want to overload an operator in a class, and we want to create a new object with it, which is made of others that we defined, we can do

NameOfClass operator+(const NameOfClass& b){ { NameOfClass tmp; tmp.length = this->length + b.length; tmp.breadth = this->breadth + b.breadth; tmp.height = this->height + b.height; return tmp; } 

I cannot understand if I can define 2 objects before this. eg

 NameOfClass one(length,breadth,height); NameOfClass two(length,breadth,height); 

I set their attributes. but how

 NameOfClass three=one+two; 

set the attributes to "three"? Both arguments are considered as an argument for the overloaded "+" operator. The function clearly says that

 tmp.length = this->length + b.length; 

but this-> length must be undefined, and b.length is private. How does he mix together? Or is it accepted as a method, so one+two = method + of one and two is passed as an argument, which means that this-> length refers to the length of the "one" object? Using an example from tutorialspoint.

 #include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // Overload + operator to add two Box objects. Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box }; // Main function for the program int main( ) { Box Box1; // Declare Box1 of type Box Box Box2; // Declare Box2 of type Box Box Box3; // Declare Box3 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); // volume of box 1 volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // volume of box 2 volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // Add two object as follows: Box3 = Box1 + Box2; // volume of box 3 volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return 0; } 
+5
source share
2 answers

1.

as

 NameOfClass three=one+two; 

set the attributes to "three"?

NameOfClass three=one+two; will be interpreted as NameOfClass three = one.operator+(two); , and three will copy / move, built from the return value of NameOfClass::operator=() .

2.

 tmp.length = this->length + b.length; 

but this-> length must be undefined, and b.length is private. How does he mix it?

What does "this-> length must be undefined" mean? Here this == &one and b == two .

b.length is private does not matter, since operator+ is a member function, it can access a private member.

+5
source

NameOfClass three = one + two; will use the copy instance created by the compiler to build three from the anonymous temporary one + two . one + two is the syntactic sugar for one.operator+(two) that you implemented.

Smarter compilers may well use the move constructor created by the compiler, as it clearly shows that anonymous time cannot be used by anything else.

You can implement these constructors yourself or rely on a compiler that generates one that copies (or moves) the element data.

+2
source

Source: https://habr.com/ru/post/1244342/


All Articles