Przeciążenie funkcji — to możliwość stworzenia kilku funkcji o tej samej nazwie, ale z różnymi argumentami. Używa się tego, aby zwiększyć czytelność i zapewnić intuicyjny interfejs.
Przeciążenie operatorów — możliwość definiowania, jak standardowe operatory działają z niestandardowymi typami danych (klasami lub strukturami).
Ograniczenia przeciążenia operatorów:
.:, .*, ::, sizeof, ?: i inne).Przykład przeciążenia operatora "+":
class Vector2D { public: float x, y; Vector2D(float _x, float _y): x(_x), y(_y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
Czy w C++ można przeciążać operator przecinka (
,) i jeśli tak, w jakim celu można to wykorzystać?
Odpowiedź:
Tak, operator przecinka można przeciążać dla niestandardowych klas.
Jednak przeciążanie operatora przecinka powinno mieć sens, ponieważ może to wprowadzać w błąd czytającego kod i prowadzić do nieprzewidzianych konsekwencji.
struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };
Historia
W ramach biblioteki matematycznej przeciążono operator==do porównywania obiektów, ale zapomniano przeciążyć operatora<. To doprowadziło do błędów kompilacji podczas próby użycia kontenerów STL, które wymagają operatora porównania, np.std::set,std::map.
Historia
Programista przeciążył operator+dla klasyMatrix, ale zamiast zwracać nowy obiekt zawsze zmieniał lewy operand. Skutkiem były nieprzewidziane efekty uboczne i naruszenie zasady "czystości" operacji.
Historia
Przy przeciążaniu funkcji z różnymi typami argumentów nie uwzględniono kwalifikatora const:void foo(SomeClass&); void foo(const SomeClass&);To doprowadziło do niejednoznaczności w wywołaniu funkcji i błędów kompilacji podczas przekazywania obiektów tymczasowych.