2020. 10. 26. 05:10ㆍ컴퓨터 수업/C++
(프렌드) 바운드, 언바운드 : blog.plorence.kr/528
(프렌드) introvert, extrovert : stackoverflow.com/questions/4660123/overloading-friend-operator-for-template-class
출력 연산자 오버로딩의 예시 (호출부)
cout << ob1 << endl;
outFile << ob1 << endl;
inFile << ob1 << endl;
출력 연산자 오버로딩의 예시(정의부) (istream, ifstream, ofstream도 모두 마찬가지이다.)
관전포인트
1. 객체를 reference로 반환했다.
- cout << x << y 와 같이 연속적인 스트림으로 출력할 경우를 대비해서 reference로 반환한다.
2. 파라미터1을 const std::ostream& _cout 으로 받지 않았다.
- 입력된 _cout은 계속 갱신되어야한다.
3. 연산자 오버로딩이 파라미터를 2개 받았다.
- 메소드 연산자 오버로딩이 아닌, 클라이언트 함수 연산자 오버로딩이라는 뜻이다.
파라미터1이 연산자를 기준으로 좌측,
파라미터2가 연산자를 기준으로 우측이라 생각하자.
출력 연산자 오버로딩에서, 해당 클라이언트 함수가 프라이빗 필드에 접근하기 위한 방법
=프렌드
관전포인트
1. 런타임에 오버로딩된 출력 연산자가 호출되면, 해당 클라이언트 함수가 해당 클래스의 프라이빗 필드에 접근 권한이 있는지 확인한다.
즉 위의 friend std::ostream~~은 런타임에 출력 연산자를 호출할때나 호출된다. (실제론 그렇지 않지만...)
템플릿 클라이언트 함수의 연산자 오버로딩.
(일단 introvert,바운드 / extrovert,언바운드 는 차치하고 생각하자.)
관전포인트
1. 어떻게 읽어야하는가?
-현재 AAA는 익명성을 지향하기에, 그 어떤 DataType을 input으로 받더라도 이쪽으로 호출된다. 그 DataType을 AAA라고 호칭한다.
만약 프라이빗 필드에 접근하지 않고, 게터를 이용한다면?
관전포인트
1. 일단 컴파일된다.
- main함수에서 VecType<int> vec으로 선언된 vec 객체가 아규먼트로 넘어가므로, 파라미터와 아규먼트의 만남에서
VecType<AAA>& _vec = (VecType<int>) vec 에서 묵시적 형변환
AAA = int가 발생한다.
따라서 _vec.get_z는 VecType<int>에 접근해서 게터 메서드를 호출한다.
friend 키워드를 사용해서 프라이빗 필드에 접근하고 싶다면?
1. extrovert, 언바운드 방식.
관전포인트
1. class의 template형식 : CCC
클라이언트 함수의 template형식 : AAA
- VecType<int>가 생성되었고, 위에서 설명하였듯이, VecType<AAA> _vec = (VecType<int>) vec에서 묵시적 형변환이 발생한다. 따라서 _vec.x는 VecType<int>의 class 상세설명서를 보게된다.
이때 새로운 template BBB가 등장한다, 이때 BBB는 정해지지 않았으므로 "익명" 또는 "임의"라는 의미를 갖게 되므로, 그 어떤 dataType으로 template class가 생성되었더라도, 해당 friend함수는 유효하다. 유효~~~
2. introvert, 바운드 방식(1)
그냥 클래스 내부에 인라인으로 넣어버린다.
이는 언바운드 방식과 다르게 딱 그 Type에만 적용된다.
근데 이게 실제로 무슨 차이가 있지...?
언바운드는 int에다가 double, char 이런거 다 선언해둔 느낌이리면
바운드는 int에다가는 int, double에다가는 double 선언해둔 느낌인데, 결론적으로 둘은 같은거 아닌가..?
위에 template 안 붇는다.
->선언과 정의부를 분리한다면?
선언부
정의부는 위와 같다.
관전포인트
1. 아래 빨간 네모 확인
'컴퓨터 수업 > C++' 카테고리의 다른 글
reference return은 대체 언제...? (0) | 2020.10.27 |
---|---|
생성자 오버로딩, 어디까지 ambiguous 한가. (0) | 2020.10.27 |
C++ 템플릿에 관한 얘기 (0) | 2020.10.26 |
CLion 인코딩 (0) | 2020.10.24 |
vector클래스 생성자 인수, 생성자의 다른 인수 기입방식 (0) | 2020.10.23 |