[문과 코린이의 IT 기록장] C,C++ - 연산자 오버로딩 4 : (cout, endl 오버로딩)
1. cout, endl 오버로딩
ex 1 )
#include <iostream>
namespace mystd { // cout과 endl을, 직접 구현하기 위해서 선언한 이름공간이다.
using namespace std; // 이 선언은 namespace mystd 내에서, 지역적으로 이루어졌으니, 이 지역 내에서만 유효한 선언이 된다.
class ostream {
public: // operator<< : 입출력 연산자 (연산자의 우변을 표준 출력(모니터)하는 기능)
void operator<<(const char* str) { printf("%s", str); }
void operator<<(const char str) { printf("%c", str); }
void operator<<(int num) { printf("%d", num); }
void operator<<(double e) { printf("%g", e); }
void operator<<(ostream& (*fp)(ostream& ostm)) { fp(*this); }
// 반환형이 ostream형이고, 인자 포인터 형이 ostream형을 가리키는, 함수포인터 fp
};
ostream& endl(ostream& ostm) { // endl은 이와 같이 함수의 형태를 띤다. (endl함수는, 반환형이 참조형)
ostm << '\n';
fflush(stdout);
return ostm; // ostm 객체 그 자체 내용을 반환한다.
}
ostream cout; // cout은, ostream 클래스의 객체이다.
}
int main() {
using mystd::cout; // 이름공간 mystd에 선언된 cout의 사용을 위해, 지역적으로 using 선언을 하였다.
using mystd::endl; // 이름공간 mystd에 선언된 endl의 사용을 위해, 지역적으로 using 선언을 하였다.
cout << "Simple String"; // cout.operator<<("Simple String") // cout은 ostream클래스의 객체라는 점 인지
cout << endl; // cout.operator<<(endl);
cout << 3.14; // cout.operator<<(3.14);
cout << endl; // cout.operator<<(endl);
cout << 123; // cout.operator<<(123);
endl(cout);
return 0;
}
ex 2 )
#include <iostream>
namespace mystd {
using namespace std;
class ostream {
public:
ostream& operator<<(char* str) {
printf("%s", str);
return *this;
// cout객체의 참조값을 반환하는 형태로 확장함으로서, 연달아 오버로딩 함수를 호출할 수 있돌록 돕는다.
}
ostream& operator<<(char str) {
printf("%c", str);
return *this;
}
ostream& operator<<(int num) {
printf("%d", num);
return *this;
}
ostream& operator<<(double e) {
printf("%g", e);
return *this;
}
ostream& operator<<(ostream& (*fp)(ostream& ostm)) {
return fp(*this);
}
};
ostream& endl(ostream& ostm) {
ostm << '\n'
fflush(stdout);
return ostm;
// endl함수는 인자로 전달된 객체의 참조값을 반환하므로, 반환된 값을 재반환하는 형태로 연산자를 오버로딩한다.
}
ostream cout;
}
int main() {
using mystd::cout;
using mystd::endl;
cout << 3.14 << endl << 123 << endl;
return 0;
}
ex 3 )
#include <iostream>
using namespace std;
class Point {
private:
int xpos, ypos;
public:
Point(int x=0,int y=0):xpos(x),ypos(y){ }
void ShowPosition() const {
cout << '[' << xpos << ", " << ypos << ']' << endl;
}
friend ostream& operator<<(ostream&, const Point&);
};
ostream& operator<<(ostream& os, const Point& pos) {
os << '[' << pos.xpos << ", " << pos.ypos << ']' << endl;
return os;
}
int main() {
Point pos1(1, 3);
cout << pos1; // cout.operator<<(pos); 맴버함수의 형태 X, operator<<(cout,pos); 전역함수의 형태O.
// 객체 출력을 위한 함수를 만들기 위해 오버로딩을 만들고자 한다. 맴버함수에 의한 방법을 선택하려면 cout객체의 맴버함수를 하나 추가해야 하므로, ostream클래스를 정정해야 하는데, 이는 불가능하기 때문에 전역함수만 가능하다.
Point pos2(101, 303);
cout << pos2;
return 0;
}
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |