2016-03-03 9 views
5

Niedawno dowiedziałem się o przeciążeniu operatorów w C++. Gdy chcesz przeciążać operatora w klasie, i chcemy utworzyć nowy obiekt z nim, że jest wykonana z innymi określiliśmy możemy zrobićOperatory przeciążające w 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; 

} 

nie mogę dowiedzieć się, czy ja definiować 2 obiekty wcześniej. np.

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

Ustalam ich atrybuty. ale jak ustawić atrybuty "trzy"? Czy jeden i dwa są uważane za argument za "+" przeciążonego operatora. Funkcja wyraźnie mówi, że ta długość powinna być niezdefiniowana, a b.length jest prywatna. Jak to się miesza? Czy jest to metoda tak one+two = + jest metoda jednego i dwóch jest przekazywana jako argument, co oznacza, że ​​ta-> długość odwołuje się do długości "jednego" obiektu? Posługując się przykładem z 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; 
} 
+0

Twoje podejrzenie, że "+ jest metodą jednego i dwóch jest przekazywane jako argument" jest poprawne. – molbdnilo

Odpowiedz

5

1.

jaki sposób

NameOfClass three=one+two; 

ustawić atrybuty "trzy"?

NameOfClass three=one+two; będą interpretowane jako NameOfClass three = one.operator+(two); i three będzie kopii/przejście wykonana z wartości powrotnej NameOfClass::operator=().

2.

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

ale this-> długość powinna być zdefiniowana i b.length jest prywatny. W jaki sposób miesza to ze sobą?

Co masz na myśli "ta-> długość powinna być nieokreślona"? Tutaj this == &one i b == two.

b.length jest private nie ma znaczenia, ponieważ operator+ jest funkcja członkiem, to mógł dostęp element prywatny.

2

NameOfClass three = one + two; użyje kompilatora generowane kopiowania konstruktora w celu skonstruowania three z anonimowy tymczasowegoone + two. one + two to cukier syntaktyczny dla one.operator+(two), który zaimplementowałeś.

Smarter kompilatory mogą również korzystać z kompilator wygenerowany ruch konstruktora, ponieważ jest jasne, że anonimowy tymczasowy nie mogą być wykorzystane przez cokolwiek innego.

Możesz zaimplementować te konstruktory samodzielnie lub polegać na kompilatorze generującym dane, które kopiuje (lub przenosi).