일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 게임
- exception
- lua
- resource management class
- 스마트 포인터
- Effective c++
- implicit conversion
- c++
- Smart Pointer
- Vector
- UE4
- 비교 함수 객체
- virtual function
- reference
- 암시적 변환
- 참조자
- 루아
- 상속
- 티스토리챌린지
- 영화 리뷰
- 언리얼
- 예외
- effective stl
- operator new
- 반복자
- 다형성
- 영화
- 오블완
- more effective c++
- 메타테이블
Archives
- Today
- Total
스토리텔링 개발자
[More Effective C++] 21. 오버로딩으로 암시적 변환 막기 본문
728x90
항목 21 : 오버로딩은 불필요한 암시적 타입 변환을 막는 한 방법이다.
암시적 변환
// Unlimited Precision Integer
class UPInt
{
public:
UPInt();
UPInt(int value);
...
};
const UPInt operator+(const UPInt& lhs, const UPInt& rhs);
// 일반적인 사용법
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2;
// 이렇게 사용하게 된다면?
upi3 = upi1 + 10;
upi3 = 10 + upi2;
- UPInt는 int를 생성자로 받아들이기 때문에 암시적 변환이 일어나 UPInt 타입을 임시 객체로 생성한다.
- 하지만, 임시 객체는 리소스의 낭비이다.
- 사실 이 코드의 목적은 타입변환이 아니라 UPInt와 int 타입 인자에 대해 operator+를 호출하는 것이다.
- 암시적 타입변환은 한 가지 답이 될 수 있겠지만, 다른 방법도 가능할 것이다.
오버로딩
const UPInt operator+(const UPInt& lhs, const UPInt& rhs);
cosnt UPInt operator+(const UPInt& lhs, int rhs);
const UPInt operator+(int lhs, const UPInt& rhs);
UPInt upi1, upi2;
// 이제 아래 코드 모두에 임시 객체는 생성되지 않는다.
UPInt upi3 = upi1 + upi2;
upi3 = upi1 + 10;
upi3 = 10 + upi2;
- 그렇지만, 신나게 오버로딩 하다 보면..
const UPInt operator+(int lhs, int rhs); // 에러!!
- 오버로딩 규칙
- 오버로딩 되는 연산자 함수는 반드시 최소한 한 개의 사용자 정의 타입을 매개변수로 가져야 한다.
- int는 사용자 정의 타입이 아니기 때문에, 위의 오버로딩은 컴파일 에러.
- 위 규칙이 없었다면.. 기존 연산자의 의미가 마음껏 바뀔 수 있을 것이다..
정리
728x90
'개발 > More Effective C++' 카테고리의 다른 글
[More Effective C++] 23. 적절한 라이브러리 선택하기 (0) | 2024.09.02 |
---|---|
[More Effective C++] 22. 대입 형태 연산자 선호하기 (0) | 2024.08.30 |
[More Effective C++] 20. 반환값 최적화(return value optimization) (0) | 2024.08.27 |
[More Effective C++] 19. 임시 객체(temporaries) (0) | 2024.08.26 |
[More Effective C++] 18. 과도 선행 평가 (0) | 2024.08.23 |
Comments