cout과 ostream.

보물창고·2022년 8월 22일
0

c++ basic 코드누리

목록 보기
40/50
post-custom-banner

cout에 대해서

  • cout에 대해서 생각을 해보면, 모든 기본 타입을 받아서 출력하고 있음.

1) 모든 기본 타입에 대한 연산자 << 오버로딩이 되어 있음.

2) ostream이라는 클래스의 전역 객체임을 알 수 있음.

3) cout << "hello " << 15 << 3.5f <<
: << 연산자를 연속해서 사용 가능함.

가장 중요!
-> 3번을 통해서 참조반환임을 생각할 수 있음.

4) 유저 타입의 cout을 만들 수 있음.

cout.operator<<(3);
cout.operator<<(3.7f);
cout.operator<<(Point);

cout을 직접 만들어보자.

  • 만들기 전의 조건
    1) iostream 헤더 포함을 제거하자. 중복되므로.
    2) using namespace std; 제거해야 함.
    3) printf를 사용하자.

  • 기본 지식
    1) 모든 기본 타입에 대해 지원을 해야 함.
    2) 연속적으로 사용이 가능함.
    cout << 1 << 3.4f <<....
    -> 오른쪽에서부터 값을 출력한 후에, 자신의 객체를 반환해야 함.

3) 자신의 객체를 값 형식으로 반환하면, 복사되므로, 참조로 반환해야 함.

4) cout과 ostream 은 std 이름 공간안에 있음.

problem

  • ostream cout객체를 직접 만들어라

유저 타입의 cout을 만들어라

cout의 특징

1) 다양항 타입을 출력할 때 printf와는 다르게 서식 문자 %d, %f 전달할 필요 없음.
-> operator<< 함수가 다양한 타입에 오버로딩되어 있음.

  • 코드
    : 이렇게 되어 있음.
cout.operator<<(int) : cout << 4;
cout.operator<<(double) : cout << 4.5f;
  • 그렇다면 이것도 가능하지 않을까?
cout.operator<<(Point) : cout << Point;
  • 하지만 유저타입이니까 cout은 오버로딩이 없음.
    • 위에서 연산자 재정의 함수는 멤버함수로 만들수 있다고 했음.
    • 이런식으로 함수를 찾음.
      • operator<<(ostream, Point)

operator<<(ostream, Point)를 만들어보자.

  1. cout은 연속적으로 출력이 가능하므로, 참조반환해야 함.
  2. ostream 인자를 const를 안하는 이유는 operator<< 연산자는 상수함수가
    아니기 때문에, const를 붙이면 안됨!
  3. 객체의 private 멤버에 접근하기 위해서 friend를 작성하자.

problem

: 객체도 cout 출력이 가능하게 만들어라

profile
🔥🔥🔥
post-custom-banner

0개의 댓글