Skip to content

Latest commit

 

History

History
139 lines (103 loc) · 3.63 KB

09-operators.md

File metadata and controls

139 lines (103 loc) · 3.63 KB

Programowanie obiektowe

Operatory

Coders School

Operatory

Operatory to specjalne funkcje. Specjalne, bo można je wywołać za pomocą określonego w nazwie operatora. Popatrz na przykład.

class Person {
    const std::string name_;
    unsigned age_;

public:
    Person(const std::string & name, unsigned age)
        : name_(name), age_(age)
    {}

    unsigned getAge() const { return age_; }
    Person& operator++() {
        age_++;
        return *this;
    }
};
int main() {
    Person adam("Adam", 25);
    ++adam;
    std::cout << adam.getAge() << '\n'; // prints 26
}

operator+=

T& T::operator +=(const T2& b);

Przykład implementacji

Computer& Computer::operator+=(Memory amount) {
    ramAmount_ += amount;
    std::cout << "Ram memory extended\n";
    return *this;
}

Przykład użycia

Computer hp{};  // default configuration
hp += Memory{8_GB};

Złe praktyki

Tego nie rób:

Computer Computer::operator+=(Memory amount) {
    ramAmount_ -= amount;
    std::cout << "Ram memory extended\n";
}

Powyższy kod zawiera 3 błędy.

  • Wewnątrz operatora += użyliśmy -=. Nikt nie spodziewa się takiego zachowania. Brakuje tylko komentarza // happy debugging
  • Brakuje nam return *this. W końcu coś zwracamy, prawda? Kompilatory na szczęście ostrzegają przed tym problemem.
  • Zwracamy kopię. operator+= powinien zwracać referencję do obiektu, aby działał tak jak każdy inny standardowy operator+=

Jakie są operatory?

Mamy ich całkiem sporo

Operatory

Zobacz operatory na cppreference.com


Ciekawostka #1

Operatory możesz też wywołać pisząc "nazwę funkcji".

Computer hp{};                  // default configuration
hp += Memory{8_GB};
hp.operator+=(Memory{8_GB});    // equal to above

Ciekawostka #2

Możesz przeciążyć (zaimplementować) prawie każdy operator, z wyjątkiem:

  • .
  • .*
  • ::
  • ?:
  • #
  • ##
  • sizeof
  • typeid