() 연산자를 오버로딩했다. return 형식을 잘 보면 m_counter += i; 즉 m_counter에 값을 더하고
m_counter을 return 하고 있다.
현재 printInt함수의 인자는 int형이다. 그런데 cents는 엄연히 Cents의 객체이기에 형이 맞지 않다.
하지만 우리의 의도는 cents는 int m_cents 하나 이거 보내고 싶은건데 방법이 없을까?
방법은 생각보다 심플하다. 즉, 내가 객체를 int형으로 casting하면 되잖아.
하지만 그렇다고 무작정 int(cents)해선 안되겠지. cents안에는 m_cents 말고도 수많은 함수들과 멤버들이 있을 수 있으니 우리가 따로 그 기능을 하는 함수를 만들어줘야한다.
지금 같은 경우 operator int()으로 int형으로 캐스팅하는 함수를 구현했다.
위의 사진들을 보면 해당 객체를 int형으로 캐스팅하려 할 때마다 operator int() 함수가 계속 호출된다.
연산자 오버로딩이 조금 더 실용적인 경우를 보자.
처음 헷갈린 부분이 Cents cents = dol; 이 부분이다
이건 마치
int a = 2;
double d = a; 이거라고 생각해보면 된다. 즉, a가 d로 복사될 때 저절로 double형으로 캐스팅되지?
dol이 cents로 복사될 때, 형변환이 필요하므로 Dollar 안의 operator Cents()함수가 호출되었고 구현한 Cents(m_dollars * 100)이 작동하고 있다.
frac을 선언하고, fr_copy(frac)을 하게되면? 인자가 Frac이니까 Fraction(const Fraction& fraction) 생성자(copy constructor)가 호출됨.
만약 복사생성자를 막고 싶다면? private으로 넣어주면 되겠지.
doSomething함수에서 Fraction temp를 return 했기에 아까와 같이 복사생성자가 호출되겠지.
여기서 유의할거?는
Fraction result = doSomething(); 이거나
Fraction result(doSomething()); 이거나 같다는 것.
보통 우리의 생각에 doSomething 함수엔 인자가 Fraction이니까 맞는 자료형을 넣어줘야할 것이다.
근데 단순히 7이라는 정수를 넣어줬음에도 frac(7) 꼴이 되서 생성자를 호출하고 있다.
이걸 변환생성자라 부른다. 컴파일러가 우리 편의를 위해 해준 것이다.
근데 이를 조금 엄격하게 하고 싶다면? 해당 생성자에 'explicit'이라는 키워드를 넣어주면 된다. 즉, 조금 더 명확히 하라는 의미.
우리가 실제 현업에서 객체를 가져다가 상속하고 이러저러 쓸일이 많을 것이다.
버전도 많아질 것이고.
이럴 때 조금 더 이를 활용할 이들에게 작업에 편의를 제공하기 위해
이 함수는 삭제되었음을 나타내줄 수 있다.
바로 delete키워드다. 동적할당에서 메모리 해제하는 delete와는 엄연히 다른 기능이다.
**
오버로딩에 대해서 거의 다 강의를 수강했는데, 느낀 점은
객체를 내 입맛에 맞게 활용함으로써 마치 객체가 일반 자료형처럼 활용할 수 있게 만들어주는 기능이라 정말 편한점이 많다고 느끼고 있다.
'C++(따라하며 배우는 C++)' 카테고리의 다른 글
Chapter 10-1,2. 객체들 사이의 관계, 구성 관계 (0) | 2021.10.28 |
---|---|
Chapter 9-(3). 연산자 오버로딩 (0) | 2021.10.27 |
Chapter 9-(1). 연산자 오버로딩 (0) | 2021.09.28 |
Chapter 8-(2). 객체지향의 기초 (0) | 2021.09.14 |
Chapter 8-(1). 객체지향의 기초 (0) | 2021.09.13 |