C++/Overloading 2021. 3. 16. 00:20

입출력 연산자 오버로딩 (I/O Operator Overloading)

  • 멤버 함수로 만들 수 없다.

    • 첫 번째 인자가 stream이기 때문이다.

예제

  • friend를 사용한 출력 연산자 오버로딩 예제

    #include <iostream>
    
    class Point
    {
      double    x_;
      double    y_;
      double    z_;
    
    public:
      Point(double x = 0.0, double y = 0.0, double z = 0.0)
        : x_(x), y_(y), z_(z)
      {}
    
      friend std::ostream& operator << (std::ostream& out, const Point& p)
      {
        out << '(' << p.x_ << ", " << p.y_ << ", " << p.z_ << ')';
        return (out);
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Point p1(0.0, 0.1, 0.2), p2(3.4, 1.5, 2.0);
    
      cout << p1 << ' ' << p2 << endl;
    }
    
    /* stdout
    (0, 0.1, 0.2) (3.4, 1.5, 2)
    */
  • stream을 통해 파일 입출력을 할 경우, 이를 이용해서 굉장히 쉽게 할 수 있다.

    • 출력되는 파일은 VS기준 왼쪽 위의 파일명을 우클릭해서 나오는 Open Containing folder를 클릭하면 열리는 폴더에 있다.
      • 단축키는 Ctrl + K를 누른 다음 R을 누르면 된다. (Ctrl + R이 아니다.)
    #include <iostream>
    #include <fstream>
    
    class Point
    {
      double    x_;
      double    y_;
      double    z_;
    
    public:
      Point(double x = 0.0, double y = 0.0, double z = 0.0)
        : x_(x), y_(y), z_(z)
      {}
    
      friend std::ostream& operator << (std::ostream& out, const Point& p)
      {
        out << '(' << p.x_ << ", " << p.y_ << ", " << p.z_ << ')';
        return (out);
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Point p1(0.0, 0.1, 0.2), p2(3.4, 1.5, 2.0);
    
      ofstream of("out.txt");
    
      of << p1 << ' ' << p2 << endl;
    
      of.close();
    }
    
    /* out.txt
    (0, 0.1, 0.2) (3.4, 1.5, 2)
    */
  • friend를 사용한 입력 연산자 오버로딩 예제

    #include <iostream>
    
    class Point
    {
      double    x_;
      double    y_;
      double    z_;
    
    public:
      Point(double x = 0.0, double y = 0.0, double z = 0.0)
        : x_(x), y_(y), z_(z)
      {}
    
      friend std::ostream& operator << (std::ostream& out, const Point& p)
      {
        out << '(' << p.x_ << ", " << p.y_ << ", " << p.z_ << ')';
        return (out);
      }
    
      friend std::istream& operator >> (std::istream& in, Point& p)
      {
        in >> p.x_ >> p.y_ >> p.z_;
        return (in);
      }
    };
    
    int        main()
    {
      using namespace std;
    
      Point p1, p2;
    
      cin >> p1 >> p2;
    
      cout << p1 << ' ' << p2 << endl;
    }
    
    /* stdin
    1 2 3 4 5 6
    */
    
    /* stdout
    (1, 2, 3) (4, 5, 6)
    */