'<< 오퍼레이터, >> 오퍼레이터' 오버로딩
<< 연산자의 이름이 double shift라고 막연히 생각했는데, insertion operator 라는 충격적인 사실을 알게 되었다. 마찬가지로 >> 도 extraction operator라는 이름을 가지고 있었다.
# C++의 표준 입출력 스트림 객체와 함께 사용되는 연산자 >> , <<
1) >> operator : extraction operator
2) << operator : insertion operator
이를 위해, msdn 의 차료를 참고해서 공부를 해보자.
1. >> operator 오버로딩(Input stream - extraction operator)
Input streams use the extraction (>>
) operator for the standard types. You can write similar extraction operators for your own types; your success depends on using white space precisely.
Here is an example of an extraction operator for the Date
class presented earlier:
istream& operator>> ( istream& is, Date& dt )
{
is >> dt.mo >> dt.da >> dt.yr;
return is;
}
이 경우에는 return by address를 통해서 istream 객체를 반환하여 chaining을 지원하여 1) is >> dt.mo, 2) is > >dt.da , 3) is >> dt.yr 순으로 실행된다.
2. << operator 오버로딩
Output streams use the insertion (<<
) operator for standard types. You can also overload the <<
operator for your own classes.
The write
function example showed the use of a Date
structure. A date is an ideal candidate for a C++ class in which the data members (month, day, and year) are hidden from view. An output stream is the logical destination for displaying such a structure. This code displays a date using the cout
object:
Date dt( 1, 2, 92 );
cout << dt;
To get cout
to accept a Date
object after the insertion operator, overload the insertion operator to recognize an ostream
object on the left and a Date
on the right. The overloaded <<
operator function must then be declared as a friend of class Date
so it can access the private data within a Date
object.
// overload_date.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class Date
{
int mo, da, yr;
public:
Date(int m, int d, int y)
{
mo = m; da = d; yr = y;
}
friend ostream& operator<<(ostream& os, const Date& dt); // friend 키워드를 통해 directly access data 가능
};
ostream& operator<<(ostream& os, const Date& dt) // 오퍼레이터 오버로딩
{
os << dt.mo << '/' << dt.da << '/' << dt.yr; // 예를 들면 5/6/92 와 같이 출력
return os;
}
int main()
{
Date dt(5, 6, 92);
cout << dt;
}
5/6/92
The overloaded operator returns a reference to the original ostream
object, which means you can combine insertions:
cout << "The date is" << dt << flush;
https://msdn.microsoft.com/ko-kr/library/1z2f6c2k.aspx