- 함수 오버로딩 : 같은 일을 처리하는 함수를 매개변수의 형식을 달리하여 하나의 이름으로 작성하게 해 줌
- 연산자 오버로딩 : 하나의 연산자를 여러 의미로 사용하게 해 줌
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 객체의 뺄셈 연산은 지원하지 않는다며
오류가 발생할 것
연산자 함수의 정의 방법
- 클래스의 멤버 함수로 정의
- 전역 함수로 정의 : 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 키워드를 사용하여 프렌드 함수로 선언해야 함
오버로딩 제약 사항
- 전혀 새로운 연산자를 정의할 수는 없음
- 기본 타입을 다루는 연산자의 의미는 재정의할 수 없고, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야 함
- 오버로딩된 연산자는 기본 타입을 다룰 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 함
- 오버로딩된 연산자는 디폴트 인수를 사용할 수 없음
오버로딩할 수 없는 연산자
- 범위 지정 연산자 ( :: )
- 멤버 연산자 ( . )
- 멤버 포인터 연산자 ( .* )
- 삼항 조건 연산자 ( ? : )
- 크기 연산자 ( sizeof )
- 타입 인식 ( typeid )
- 상수 타입 변환 ( const_cast )
- 동적 타입 변환 ( dynamic_cast )
- 재해석 타입 변환 ( reinterpret_cast )
- 정적 타입 변환 ( static_cast )
멤버 함수로만 오버로딩할 수 있는 연산자 (전역 함수로 불가)
- 대입 연산자 ( = )
- 함수 호출 ( () )
- 배열 인덱스 ( [ ] )
- 멤버 접근 연산자 ( -> )
참고)
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'[공부] > C++' 카테고리의 다른 글
[C++] 기본 정리 17 - OOP의 상속성(파생 클래스, 멤버 함수 오버라이딩, 다중 상속) (0) | 2024.02.26 |
---|---|
[C++] 기본 정리 16 - OOP의 캡슐화(프렌드, 정적 멤버, 상수 멤버) (0) | 2024.02.25 |
[C++] 기본 정리 14 - 생성자, 복사 생성자, 소멸자 (0) | 2024.02.24 |
[C++] 기본 정리 13 - 클래스, 객체 지향 프로그래밍, this 포인터 (1) | 2024.02.24 |
[C++] 기본 정리 12 - C++ 범위(유효 범위, 연결, 네임스페이스) (0) | 2024.02.22 |