프로그래밍C++ 개발자

C++에서 함수 오버로딩(Function Overloading)과 연산자 오버로딩(Operator Overloading)이란 무엇입니까? 어떤 제한 사항이 있으며 오버로딩 사용 시 오류가 발생할 수 있는 위험은 무엇입니까? 사용자 정의 클래스에 대한 덧셈 연산자 오버로딩의 예를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

함수 오버로딩 — 동일한 이름을 가진 여러 함수를 만들 수 있는 기능으로, 서로 다른 인수를 가질 수 있습니다. 이는 가독성을 높이고 직관적인 인터페이스를 제공하는 데 사용됩니다.

연산자 오버로딩 — 사용자 정의 데이터 유형(클래스 또는 구조체)과 함께 작동하는 방식으로 표준 연산자를 정의할 수 있는 기능입니다.

연산자 오버로딩의 제한 사항:

  • 모든 연산자를 오버로딩할 수는 없습니다 (.:, .*, ::, 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&);

이것은 함수 호출의 모호성을 초래하고 임시 객체를 전달할 때 컴파일 오류를 발생시켰습니다.