본문 바로가기
[공부]/C++

[C++] 기본 정리 15 - 연산자 오버로딩

by 개발꿈냥무 2024. 2. 24.

- 함수 오버로딩 : 같은 일을 처리하는 함수를 매개변수의 형식을 달리하여 하나의 이름으로 작성하게 해 줌

- 연산자 오버로딩 : 하나의 연산자를 여러 의미로 사용하게 해 줌

 

C++에선, 연산자 오버로딩을 사용자 정의 타입까지 확장할 수 있고, 클래스도 하나의 타입임을 확실하게 보여줌


연산자 함수 (operator function)

  • C++에서 연산자를 오버로딩하기 위해 사용
  • operator 키워드 사용 (문법 : operator오버로딩할연산자(매개변수목록) )
  • 오버로딩할 연산자는 적법한 C++ 연산자여야 하며, operator 키워드와 공백 없이 연결되어야 함
  • 장점 : 복잡한 함수 이름 대신, 간편하게 연산자를 사용할 수 있음
연산자 함수 예)
Position Position::operator-(const Position& other) {
	return Position( (x_ + other.x_)/2, (y_ + other.y_)/2 );
}

만약 이러한 연산자 오버로딩을 하지 않으면, 
C++ 컴파일러는 두 Position 객체의 뺄셈 연산은 지원하지 않는다며
오류가 발생할 것

 

 

연산자 함수의 정의 방법

  1. 클래스의 멤버 함수로 정의
  2. 전역 함수로 정의 : private 멤버에 대한 접근을 위해 C++가 제공하는 프렌드 함수를 사용할 수 있음
전역 함수로 정의한 예)
Position operator-(const Position& pos1, const Position& pos2) {
	return Position( (pos1.x_ + pos2.x_)/2, (pos1.y_ + pos2.y_)/2 );
}

전역 함수는 private 멤버인 x_와 y_에 접근하지 못하므로,
friend 키워드를 사용하여 프렌드 함수로 선언해야 함

 

 

 


오버로딩 제약 사항

  1. 전혀 새로운 연산자를 정의할 수는 없음
  2. 기본 타입을 다루는 연산자의 의미는 재정의할 수 없고, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야 함
  3. 오버로딩된 연산자는 기본 타입을 다룰 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 함
  4. 오버로딩된 연산자는 디폴트 인수를 사용할 수 없음

 

오버로딩할 수 없는 연산자

  • 범위 지정 연산자 ( :: )
  • 멤버 연산자 ( . )
  • 멤버 포인터 연산자 ( .* )
  • 삼항 조건 연산자 ( ? : )
  • 크기 연산자 ( sizeof )
  • 타입 인식 ( typeid )
  • 상수 타입 변환 ( const_cast )
  • 동적 타입 변환 ( dynamic_cast ) 
  • 재해석 타입 변환 ( reinterpret_cast )
  • 정적 타입 변환 ( static_cast )

 

멤버 함수로만 오버로딩할 수 있는 연산자 (전역 함수로 불가)

  • 대입 연산자 ( = )
  • 함수 호출 ( () )
  • 배열 인덱스 ( [ ] )
  • 멤버 접근 연산자 ( -> )

 

 


참고)

코딩의 시작, TCP School

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com