이거 C#에서도 동일함
객체 없이도 호출가능한거
'::' 범위 확인하는 연산자.
g_int는 지금 전역변수이다.
왜? => 어떤 함수안에 선언을 하지 않았기 때문에
접근 하려면 이렇게 해야함.
cin, cout은 C, C++ 표준기능들이 namespace std안에
들어있는 것이다.
#include < iostream >을 통해서 cin, cout기능을 사용할 수 있는데 이것이,
그런데 이 기능들이 전부다 namespace std안에 다 구현이 되어있는 것이다.
그래서 지칭 해주어야함.
namespace 로 변수명 구분해줄려고.
using std
그래서 std::cin => cin으로 사용가능.
그런데 기능상실할 수 있다 == 모호해진다.
이런경우.
그래서 특정 기능들만 가지고 오고 싶을 경우
using std::cin
using std::cout
이런식으로.
ostream이라는 "객체"의 하나의 변수명이다.
cin은 isteam이라는 객체의 변수명이다.
이렇게 전역변수로 전언을 해놓음
근데
extern이다. == 외부변수
정젹변수, 외부변수 => 데이터영역
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C%EC%A7%80%EC%97%AD%EC%A0%84%EC%97%AD-%EB%B3%80%EC%88%98
extern a해서 a를 데이터 영역에 올려서
프로그램 실행 내내 상주 시켜서 안 없어지게 할려고.
전역변수는 특정 cpp에서밖에 안되니까 extern을 사용하는 것임.
여러개의 파일에서 공통으로 접근할 수 있는 전역변수 만들 때,
extern 썻었다.
근데 extern 키워드로 모든 파일에서 접근 가능.
을 하게되면 프로그램 실행을 하면서
하나밖에 없는 전역 객체 cout, cin를 알게되는 것이다.
애내들은 뭔데 그럼?
"연산자 오버로딩"이다.
이런 경우 객체를 만들었다면 실체는 그래도 있어야하니까
자료형의 타입을 1바이트로 준다.
이렇게 오버로딩 해준다.
'<<' 호출??
이렇게하면 호출됨.
호출해준애가 mycout이라 operator에 들어온 객체는
this == mycout이다.
그래서
이부분에서 cout << "asd" << 10 << endl;
이 가능한 이유가
연산자 오버로딩을 통한 cout << "asd"를 하면
인자로 받아간 asd를 처리를 하고 반환 값으로 자기 자신을 반환함
그래서
cout << "asd"를 하고나서 반환으로 cout이 다시 와서
cout << 10 << endl;이 연속적으로 일어나는게 가능하다.
자기 자신의 주소(자기자신을 참조)를 반환해야함
return *this는
자기자신(원본)을 반환하는데
operator의 반환값이 CMyOStrea&이라 참조를 this의 원본에 접근(*)해 자기 자신의 참조를 반환한다.
지금 반환타입이 CMyOStream& 이 잘 이해가 가지 않는다 =>
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C54%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%B0%EC%97%B4
이거 밑에 부분 다시 읽으셈
"안녕" == '안' => 1바이트, '녕' => 1바이트인데
2바이트 문자열 출력하려면
using std::wcout
CMyOStream& operator(const wchar_t* InputString)
{
printf("%s\n", InputString);
return *this;
}
출력할때는
mycout << L"안녕하세요" << endl;
이렇게 오버로딩해주고
이거 추가해준다.
C 스타일에서는
입력을 받을 때, scanf를 통해서 주소를 넘겨주었었는데
c++에서는 refrence사용이 가능하니까
mycout 객체에 << a 변수를 넘겨주고
이렇게 << 오버로딩 연산자에서 int&
참조를 받으면됨.
안에서는 scanf_s("%d", &_data);
이런 함수임. 반환은 void인데
이것을 호출 하려면,
반환 타입이 void이고 인자도 void인 함수를 호출 하겠다 이다.
<< 연산자를 오버로딩 했을 경우.
void(*Func)(void) 이해가 안간다면
https://velog.io/@starkshn/CPP%EC%96%B4%EC%86%8C48%ED%95%A8%EC%88%98-%ED%8F%AC%EC%9D%B8%ED%84%B0
void-1 (Func)-2 void-3
반환타입이 void-1이고, 인자가 없는(void-3) 그런 함수의 주소를(Func-3)를 받겠다.
그러니까 << 연산자를 오버로딩했는데,
무슨 버젼으로 오버로딩했냐면은
인자로 반환타입이 void이고 인자로 아무것도 받지 않는(void) 함수의 주소를 받는다는 뜻이다.
가 이렇게 선언되어있기 때문에
이렇게 호출해 줄 수 있는 것이다.
(지금은 MyEndl인데 이게 endl이라는 이름으로 되어있을 뿐이다.)