인프런 커뮤니티 질문&답변

ii00님의 프로필 이미지
ii00

작성한 질문수

홍정모의 따라하며 배우는 C++

9.3 강의 보다가 궁금한 점

작성

·

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 &cents) {
		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 &cents)
{
  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 값인 truefalse 는 출력 시 정수로 변환되어 10 으로 출력됩니다.
따라서, !cents1cents1m_cents 값이 6 이기 때문에 false (즉, 0) 를, !cents2cents2m_cents 값이 0 이기 때문에 true (즉, 1)를 출력합니다.

ii00님의 프로필 이미지
ii00
질문자

감사합니다. 그럼 네번째, 다섯번째에서 (0)과 (1)이 아닌, 0과 1이 출력되는 이유는 뭔가요?

<< 연산자와 ! 연산자의 오버로딩 구현 부분을 보시면,

<< 연산자는

//...
out << "(" << cents.m_cents << ")";
//...

으로, "("")" 를 함께 출력하도록 되어 있습니다.
따라서, "("")" 와 같이 출력됩니다.

반면, ! 연산자 오버로딩은 단순히 값을 반환하며, 반환된 값에 대하여 표준 출력 << 스트림을 사용하여 출력합니다.

! 연산자의 반환값 truefalse 에 대한 출력은 Cents 객체의 std::ostream& operator << 오버로딩과는 관련이 없으며,
단순히 bool 값의 표준 출력 방식에 따른 것입니다.

(Cents 객체의 오버로딩된 << 연산자를 통해서 직접적으로 출력이 이루어지는 것이 아니라,
Cents 객체에 대해 ! 연산자를 사용한 결과를 표준 출력 스트림으로 출력)

ii00님의 프로필 이미지
ii00

작성한 질문수

질문하기