2016-03-03 20 views
5

Ich habe vor kurzem über das Überladen von Operatoren in C++ herausgefunden. Wenn Sie einen Operator in der Klasse zu überlasten möchten, und wir wollen mit ihm neues Objekt erstellen, die von anderen gemacht wird, wir definiert sind, können wirOperatoren überladen in C++

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; 

} 

kann ich herausfinden, kippe, wenn ich zwei Objekte vor diesem definieren. z. B.

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

Ich habe ihre Attribute festgelegt. aber wie funktioniert

NameOfClass three=one+two; 

die Attribute von "drei" eingestellt? Werden sowohl Eins als auch Zwei als Argument für "+" überladene Operatoren betrachtet. Die Funktion sagt eindeutig

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

aber diese-> Länge sollte nicht definiert sein und b.length ist privat. Wie mischt es es zusammen? Oder ist es als Methode so genommen one+two = das + ist die Methode von eins und zwei wird als Argument übergeben, was bedeutet, dass this -> Länge auf die Länge von "ein" Objekt verweist? Beispiel von tutorialspoint verwenden.

#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; 
} 
+0

Ihr Verdacht, dass "das + ist Methode von eins und zwei wird als Argument übergeben" ist richtig. – molbdnilo

Antwort

5

1.

wie funktioniert

NameOfClass three=one+two; 

die Attribute von "drei" eingestellt?

NameOfClass three=one+two; als NameOfClass three = one.operator+(two); interpretiert werden, und three wird Kopieren/Verschieben von dem Rückgabewert von NameOfClass::operator=() aufgebaut sein.

2.

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

aber this-> Länge sollte nicht definiert sein und b.length ist privat. Wie mischt es es zusammen ?

Was meinst du "this -> Länge sollte nicht definiert sein"? Hier this == &one und b == two.

b.length ist private spielt keine Rolle, weil operator+ die Funktion Mitglied ist, es konnte den privaten Member-Zugang.

2

NameOfClass three = one + two; einen Compiler generierte Copykonstruktor um three vom anonymen temporärenone + two zu konstruieren, verwenden. one + two ist syntaktischer Zucker für one.operator+(two), die Sie implementiert haben.

Smarter Compiler kann auch verwenden, um ein Compiler generierte Bewegung Konstruktor, da es klar ist, dass die anonyme temporäre nicht durch irgendetwas anderes verwendet werden.

Sie können diese Konstruktoren selbst implementieren oder sich darauf verlassen, dass der Compiler einen generiert, der die Memberdaten kopiert (oder verschiebt).

Verwandte Themen