작성
·
115
1
class Cents {
private:
int m_cents;
public:
Cents(int cents = 0) {
m_cents = cents;
}
int getCents() const {
return m_cents;
}
int& getCents() {
return m_cents;
}
Cents operator - () const {
return Cents(-m_cents);
}
bool operator ! () const {
return (m_cents == 0) ? true : false;
}
friend std::ostream& operator << (std::ostream &out, const Cents ¢s) {
out << "(" << cents.m_cents << ")";
return out;
}
};
int main() {
Cents cents1(6);
Cents cents2(0);
cout << cents1 << endl;
cout << cents2 << endl;
cout << -cents(-10) << endl;
cout << !cents1 << endl;
cout << !cents2 << endl;
return 0;
}
// 결과
(6)
(0)
(10)
0
1
이렇게 1~3번째와 4,5번째가 다른 이유가 궁금합니다.
답변 1
1
안녕하세요, 질문&답변 도우미 Soobak 입니다.
출력 결과의 첫 번째 ~ 세 번째 줄은
friend std::ostream& operator << (std::ostream &out, const Cents ¢s)
{
out << "(" << cents.m_cents << ")";
return out;
}
위의 operator <<
연산자에 대한 오버로딩 결과로, Cents
객체의 m_cents
값을 괄호로 둘러싸서 출력하도록 구현되어있기 때문입니다.
네 번째 ~ 다섯 번째 줄은
bool operator ! () const
{
return (m_cents == 0) ? true : false;
}
논리 부정 연산자 operator !
에 대한 오버로딩 결과로, Cents
객체의 m_cents
값이 0
이면 true
를, 그렇지 않으면 false
를 반환합니다.
이 때, bool
값인 true
와 false
는 출력 시 정수로 변환되어 1
과 0
으로 출력됩니다.
따라서, !cents1
은 cents1
의 m_cents
값이 6
이기 때문에 false
(즉, 0
) 를, !cents2
는 cents2
의 m_cents
값이 0
이기 때문에 true
(즉, 1
)를 출력합니다.
<<
연산자와 !
연산자의 오버로딩 구현 부분을 보시면,
<<
연산자는
//...
out << "(" << cents.m_cents << ")";
//...
으로, "("
와 ")"
를 함께 출력하도록 되어 있습니다.
따라서, "("
와 ")"
와 같이 출력됩니다.
반면, !
연산자 오버로딩은 단순히 값을 반환하며, 반환된 값에 대하여 표준 출력 <<
스트림을 사용하여 출력합니다.!
연산자의 반환값 true
와 false
에 대한 출력은 Cents
객체의 std::ostream& operator <<
오버로딩과는 관련이 없으며,
단순히 bool
값의 표준 출력 방식에 따른 것입니다.
(Cents
객체의 오버로딩된 <<
연산자를 통해서 직접적으로 출력이 이루어지는 것이 아니라,Cents
객체에 대해 !
연산자를 사용한 결과를 표준 출력 스트림으로 출력)
감사합니다. 그럼 네번째, 다섯번째에서 (0)과 (1)이 아닌, 0과 1이 출력되는 이유는 뭔가요?