Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 오버로드할 수 없는 연산자 총정리

C++에서는 +, -, [], -> 등 대부분의 연산자를 사용자 정의 타입에 맞게 오버로드(재정의)할 수 있습니다. 하지만 모든 연산자가 오버로드 가능한 것은 아니며, 일부 연산자는 언어 차원에서 오버로드가 금지되어 있습니다.

오버로드할 수 없는 연산자 목록

  • . — 멤버 접근 연산자 (점 연산자)
  • ? : — 삼항 조건 연산자
  • :: — 범위 지정(scope resolution) 연산자
  • .* — 멤버 포인터 접근 연산자
  • sizeof — 객체 크기 연산자
  • typeid — 객체 타입 조회 연산자

오버로드가 금지된 이유

이 연산들은 오버로드를 허용할 경우 심각한 프로그래밍 문제를 일으킬 수 있기 때문에 언어 사양에서 아예 금지되어 있습니다.

핵심적인 이유는 이 연산자들의 피연산자가 값(value)이 아니라 이름(identifier)이나 타입 자체라는 점입니다. 예를 들어 . 연산자의 왼쪽 피연산자는 객체의 이름이고, ::의 피연산자는 클래스나 네임스페이스의 이름입니다. 만약 이들을 오버로드할 수 있다면, 코드만 보고 어떤 의미로 해석될지 알 수 없어 프로그램의 기본적인 가독성과 예측 가능성이 무너지게 됩니다.

예시: sizeof 연산자

sizeof 연산자는 피연산자로 주어진 객체나 데이터 타입의 크기를 바이트 단위로 반환합니다. 중요한 점은 이 값이 컴파일 시간에 컴파일러에 의해 평가된다는 것입니다. 즉, 런타임에 계산되는 것이 아니므로 사용자가 오버로드하여 동작을 바꾸는 것이 불가능합니다.

마찬가지로 typeid도 RTTI(Runtime Type Information) 메커니즘을 통해 컴파일러가 관리하는 타입 정보에 의존하며, .*? : 역시 언어의 핵심 제어 흐름과 직결되어 있어 오버로드를 허용하지 않습니다.

정리

C++은 연산자 오버로딩을 통해 강력한 표현력을 제공하지만, 언어의 기본 문법 구조와 컴파일 시간 평가에 관여하는 위 여섯 가지 연산자는 예외입니다. 이는 프로그램의 일관성과 안전성을 지키기 위한 설계적 선택이라고 이해하면 됩니다.