함수 오버로딩 — 동일한 이름을 가진 여러 함수를 만들 수 있는 기능으로, 서로 다른 인수를 가질 수 있습니다. 이는 가독성을 높이고 직관적인 인터페이스를 제공하는 데 사용됩니다.
연산자 오버로딩 — 사용자 정의 데이터 유형(클래스 또는 구조체)과 함께 작동하는 방식으로 표준 연산자를 정의할 수 있는 기능입니다.
연산자 오버로딩의 제한 사항:
.:, .*, ::, sizeof, ?: 등)."+" 연산자 오버로딩 예:
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); } };
C++에서 콤마(`,`) 연산자를 오버로딩하는 것이 허용됩니까? 허용된다면, 이를 위해서는 무엇이 필요합니까?
답변:
네, 사용자 정의 클래스에 대해 콤마 연산자를 오버로딩할 수 있습니다.
그러나 콤마 연산자를 오버로딩하는 것은 명확한 의미가 있는 경우에만 해야 하며, 그렇지 않으면 코드를 읽는 사람을 혼란스럽게 하고 예상치 못한 결과를 초래할 수 있습니다.
struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };
이야기
수학 라이브러리에서 객체를 비교하기 위해==연산자를 오버로딩했지만,<연산자를 오버로딩하는 것을 잊었습니다. 이로 인해 비교 연산자를 요구하는 STL 컨테이너(std::set,std::map등)를 사용할 때 컴파일 오류가 발생했습니다.
이야기
개발자가Matrix클래스에 대해+연산자를 오버로딩했지만, 새로운 객체를 반환하는 대신 왼쪽 피연산자를 항상 변경했습니다. 그 결과로 예상치 못한 부작용과 "연산의 순수성" 원칙 위반이 발생했습니다.
이야기
서로 다른 타입의 인수를 가진 함수를 오버로딩할 때 const 한정자를 고려하지 않았습니다:void foo(SomeClass&); void foo(const SomeClass&);이것은 함수 호출의 모호성을 초래하고 임시 객체를 전달할 때 컴파일 오류를 발생시켰습니다.