728x90

황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!

https://search.shopping.naver.com/book/catalog/32436115747

 

C++ Programming : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

조작자의 실행 과정

  • 조작자를 만들기 전에 조작자가 어떻게 작동하는지 알아보자.
  • 조작자는 항상 << 나 >> 연산자와 함께 실행된다.
cout << endl;
  • 컴파일러는 << 연산자를 처리하는 방식과 동일하게 앞의 문장을 아래와 같이 변형한다.
cout . << (endl); // 컴파일러에 의해 변형
  • 위 코드는 << 연산자 함수를 호출하며, endl() 함수의 주소가 매개 변수 _f에 전달된다.
ostream& ostream::operator << (ostream& (* _f)(ostream&)) {
    (*_f)(*this); // *this는 cout
    return *this; // cout의 참조 리턴
}
  • 앞의 코드에서 (*_f)(*this);의 의미를 세분화하면 아래와 같다.
    • (*_f) => endl() 함수 호출문
    • (*this) => cout 객체
    • (* _f)(*this); => endl(cout); 함수 호출
  • 결국 << 연산자 함수는 endl(cout)을 호출한다.
  • endl() 함수는 <ostream> 헤더 파일에 구현되어 있다.
ostream& endl(ostream& outs) {
    outs.put('\n'); // 개행 문자 삽입
    outs.flush(); // 버퍼 강제 출력
    return outs; // 출력 스트림의 참조 리턴
}
  • endl() 함수는 참조 매개 변수 outs에 cout을 전달받아, cout에 개행 문자 ('\n')를 삽입하고, cout의 버퍼를 모두 화면에 출력한 후, cout에 대한 참조를 리턴한다.

 


새로운 조작자 만들기

  • 매개 변수 없는 조작자는 아래와 같이 모두 동일한 원형을 가진다.
istream& manipulatorFunction (istream& ins)
// 입력 스트림에 사용되는 조작자 원형

ostream& manipulatorFunction (ostream& outs)
// 출력 스트림에 사용되는 조작자 원형
  • 조작자들은 모두 << 나 >> 연산자에 의해 동일한 형식으로 호출되기 때문에, 다른 형식으로 조작자 함수를 만들 수 없다.
ostream& fivestar(ostream& outs) {
    outs << "*****"; // 스트림에 '*' 다섯개 출력
    return outs; // 스트림 리턴
}

// fivestar 조작자는 다음과 같이 이용된다.
cout << fivestar << "C++"; // *****C++이 출력된다.
  • 아래는 출력 스트림에 사용되는 조작자를 만든 예시이다.
#include <iostream>

using namespace std;
ostream& fivestar(ostream& outs) {
	return outs << "*****";
}
ostream& rightarrow(ostream& outs) {
	return outs << "---->";
}
ostream& beep(ostream& outs) {
	return outs << '\a';
}
int main() {
	cout << "C" << rightarrow << "C++" << rightarrow << "Java" << endl;
	cout << "Visual" << fivestar << "C++" << endl;
}

 

  • 아래는 입력 스트림에 사용되는 조작자를 만든 예시이다.
#include <iostream>
#include <string>
using namespace std;

istream& question(istream& ins) {
	cout << "거울아 거울아 누가 제일 이쁘니?";
	return ins;
}

int main() {
	string answer;
	cin >> question >> answer;
	cout << "세상에서 제일 이쁜 사람은 " << answer << "입니다." << endl;
}
728x90

'Programming Language > C++' 카테고리의 다른 글

[C++] C++ 코드와 C 코드의 링킹  (1) 2023.12.27
[C++] 예외 처리  (1) 2023.12.27
[C++] 삽입 연산자(<<)와 추출 연산자(>>)  (0) 2023.12.21
[C++] 포맷  (1) 2023.12.21
[C++] ostream과 istream  (1) 2023.12.20