문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C,C++ - 연산자 오버로딩 4 : (cout, endl 오버로딩)

벼리네 2021. 2. 25. 11:28
반응형

[문과 코린이의 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;

}


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형