728x90
황기태 저자의 명품 C++ Programming 개정판을 읽고 학습한 내용을 정리한 포스트입니다!
https://search.shopping.naver.com/book/catalog/32436115747
조작자의 실행 과정
- 조작자를 만들기 전에 조작자가 어떻게 작동하는지 알아보자.
- 조작자는 항상 << 나 >> 연산자와 함께 실행된다.
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 |