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

빵이좋아님의 프로필 이미지
빵이좋아

작성한 질문수

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

9.2 입출력 연산자 오버로딩 하기

입출력 오버로딩 질문이요

작성

·

333

3

강의 4:48초에 나오는

friend std::ostream& operator << (std::ostream &out,const Point &point)

{

   out << point.m_x << point.m_y << point.m_z ; 

} 

여기서 첫번째 파라미터가 point클래스가 아니라서 member function 으로 만들기가 어렵다고 하셨는데 의미를 잘 모르겠어서  구글링하고 생각해봤는데 맞는지 여쭤보고 싶어요 

멤버 함수로 만들 수 없는 이유? 를 생각해보면 

  << 연산자를 호출? 하는게  point 클래스 객체가 아니라서 인가요?? 

답변 2

5

멤버함수로 만드려면 왼쪽 피연산자 클래스에 만들어야 된다는 것을 알고 계실 것입니다.

(예를 들어 pt 객체가 Point 클래스 타입이라고 가정했을 때, pt + 3 뭐 이런 연산을 하고 싶다면 왼쪽 피연산자인 pt 의 클래스인 Point 내에 + 연산자 오버로딩 정의가 들어가야 한다는 것입니다. 즉 Point 의 멤버함수로서요! 이때 오른쪽 피연산자를 받을 매개변수는 int 가 되겠죠.)

입출력 연산자 << 의 왼쪽 피연산자는 ostream 클래스의 cout 객체입니다. cout << .... 이런 형태니까요! 

그렇다면 << 를 멤버함수로서 오버로딩하기 위해선 ostream 클래스에서 멤버함수를 정의해주어야 한다는 이야기인데, ostream 은 C++ 에서 제공하는 표준 클래스이고 저희가 임의로 수정할 수가 없습니다. 

그래서 입출력 연산자 오버로딩을 멤버함수로 만드는 것이 불가능하다는 것입니다.

그냥 전역함수로 오버로딩하면 왼쪽 피연산자에 ostream 객체를, 오른쪽 피연산자에 오버로딩할 대상 타입 객체를 받을 수 있도록 매개 변수 두개 설정하면 됩니다.  

0

빵이좋아님의 프로필 이미지
빵이좋아
질문자

감사합니다!!

빵이좋아님의 프로필 이미지
빵이좋아

작성한 질문수

질문하기