20111209_(c++)friend 함수, this 포인터
Programming/C, C++ 2011. 12. 9. 17:14 |Friend 함수
멤버가 아닌 함수가 클래스의 private 멤버를 접근할 수 있도록 허용해주는 것.
클래스 선언의 public 구역에, 맨 앞에 friend 키워드를 써서 friend 함수를 만든다.
This 포인터
① this 는 자기 자신을 가리키는 포인터로, 클래스 내부에서 자기자신의 멤버 변수나 멤버 함수에 접근하기 위해서 사용된다.
예를 들어, int a가 멤버변수라면 this.a 로 접근할 수 있다. 클래스 내부에선 a나 this.a나 똑같이 접근이 된다.
하지만 가끔 명시적으로 써줘야 할 때가 있다.
다음 코드는 func 함수의 생성자이다.
void func(int a) {
a = a; // 멤버변수 a에 지역변수 a 값을 할당하는 시츄에이션.
}
난 다르게 생각하고 짠 코드였는데, 컴파일러는 a를 지역변수로 인식해버린다.
이럴 때 this.a = a; 면 만사형통. 뭐 이럴 때 써먹으려고 알아두는 거인듯.
② 객체를 생성할 때, 각 객체마다 멤버변수와 멤버함수가 모두 포함된다고 생각할 수 있는데 실은 그게 아닌가보다.
멤버변수는 각 객체마다 할당되지만, 멤버함수는 모든 객체가 멤버함수를 공유해서 사용한다.
얘를 함 관찰해보자. 뭐 당연히 굴러가는 결과라고 생각할 지도 모르지만,
각 객체는 하나의 멤버함수를 공유해서 사용한다고 한다면 함수 OutValue()는 무슨 수로 Value가 어떤 객체의 변수인지 알아낼까?
함수는 호출원으로부터 정보를 전달받을 때 인수를 사용하는데, OutValue 함수의 원형을 보면 어떠한 인수도 받아들이지 않는다.
입력값인 인수가 없으면 함수의 동작은 항상 같을 수밖에 없음에도 불구하고 OutValue는 호출한 객체에 따라 다른 동작을 할 수 있다.
그 이유는 main에서 OutValue를 호출할 때 어떤 객체 소속의 멤버 함수를 호출할 것인지를 함수 이름앞에 밝혔기 때문인데
일반적인 함수의 입장에서 봤을 땐 자신을 호출한 문장 앞에 붙어있는 A, B 따위의 객체이름을 읽을 수 없지만
멤버 함수가 호출한 객체를 구분하기 위해 컴파일러가 호출문의 객체를 함수의 인수로 몰래 전달해준다.
우리 눈에 명시적으로 보이진 않지만, OutValue 함수는 자신을 호출한 객체의 번지를 인수로 전달받는다.
이때 전달받은 숨겨진 인수를 this라고 하는데, 호출한 객체의 번지를 가리키는 포인터 상수이다.
③ 클래스의 멤버함수 호출 시 어떤 객체가 멤버함수를 호출했는지 구별할 수 있도록 호출한 객체를 함수로 전달한다.
이 때 함수는 이 객체를 받기 위한 포인터를 매개변수로 가지게 되는데 이를 this 라고 한다.
(다른건 다 이해가 되는데, 정의만 모르겠다. 후)
그래서, 이렇게 쓴다.
this : 호출객체의 주소
this-> : 같은 객체 멤버 사용 (멤버변수, 멤버함수)
*this : 호출 객체 자체를 사용
참고(+이미지 출처)
http://www.winapi.co.kr/
http://blog.naver.com/flowerofeden.do
http://blog.naver.com/playboy999.do
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67386062&qb=YysrIHRoaXM=&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=gXcZ435Y7asssbizTKNssc--305488&sid=TuFGYBVC4U4AADPSErY
http://blog.naver.com/mrsooho/90104273727
멤버가 아닌 함수가 클래스의 private 멤버를 접근할 수 있도록 허용해주는 것.
클래스 선언의 public 구역에, 맨 앞에 friend 키워드를 써서 friend 함수를 만든다.
This 포인터
① this 는 자기 자신을 가리키는 포인터로, 클래스 내부에서 자기자신의 멤버 변수나 멤버 함수에 접근하기 위해서 사용된다.
예를 들어, int a가 멤버변수라면 this.a 로 접근할 수 있다. 클래스 내부에선 a나 this.a나 똑같이 접근이 된다.
하지만 가끔 명시적으로 써줘야 할 때가 있다.
다음 코드는 func 함수의 생성자이다.
void func(int a) {
a = a; // 멤버변수 a에 지역변수 a 값을 할당하는 시츄에이션.
}
난 다르게 생각하고 짠 코드였는데, 컴파일러는 a를 지역변수로 인식해버린다.
이럴 때 this.a = a; 면 만사형통. 뭐 이럴 때 써먹으려고 알아두는 거인듯.
② 객체를 생성할 때, 각 객체마다 멤버변수와 멤버함수가 모두 포함된다고 생각할 수 있는데 실은 그게 아닌가보다.
멤버변수는 각 객체마다 할당되지만, 멤버함수는 모든 객체가 멤버함수를 공유해서 사용한다.
얘를 함 관찰해보자. 뭐 당연히 굴러가는 결과라고 생각할 지도 모르지만,
각 객체는 하나의 멤버함수를 공유해서 사용한다고 한다면 함수 OutValue()는 무슨 수로 Value가 어떤 객체의 변수인지 알아낼까?
함수는 호출원으로부터 정보를 전달받을 때 인수를 사용하는데, OutValue 함수의 원형을 보면 어떠한 인수도 받아들이지 않는다.
입력값인 인수가 없으면 함수의 동작은 항상 같을 수밖에 없음에도 불구하고 OutValue는 호출한 객체에 따라 다른 동작을 할 수 있다.
그 이유는 main에서 OutValue를 호출할 때 어떤 객체 소속의 멤버 함수를 호출할 것인지를 함수 이름앞에 밝혔기 때문인데
일반적인 함수의 입장에서 봤을 땐 자신을 호출한 문장 앞에 붙어있는 A, B 따위의 객체이름을 읽을 수 없지만
멤버 함수가 호출한 객체를 구분하기 위해 컴파일러가 호출문의 객체를 함수의 인수로 몰래 전달해준다.
우리 눈에 명시적으로 보이진 않지만, OutValue 함수는 자신을 호출한 객체의 번지를 인수로 전달받는다.
이때 전달받은 숨겨진 인수를 this라고 하는데, 호출한 객체의 번지를 가리키는 포인터 상수이다.
③ 클래스의 멤버함수 호출 시 어떤 객체가 멤버함수를 호출했는지 구별할 수 있도록 호출한 객체를 함수로 전달한다.
이 때 함수는 이 객체를 받기 위한 포인터를 매개변수로 가지게 되는데 이를 this 라고 한다.
그래서, 이렇게 쓴다.
this : 호출객체의 주소
this-> : 같은 객체 멤버 사용 (멤버변수, 멤버함수)
*this : 호출 객체 자체를 사용
참고(+이미지 출처)
http://www.winapi.co.kr/
http://blog.naver.com/flowerofeden.do
http://blog.naver.com/playboy999.do
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67386062&qb=YysrIHRoaXM=&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0&pid=gXcZ435Y7asssbizTKNssc--305488&sid=TuFGYBVC4U4AADPSErY
http://blog.naver.com/mrsooho/90104273727
'Programming > C, C++' 카테고리의 다른 글
20111215_구조체, 상속성 (0) | 2011.12.15 |
---|---|
20111212_C 기초부터 정리하긔 (0) | 2011.12.12 |
20111212_정적멤버변수/함수, 상수멤버 (0) | 2011.12.12 |
20111208_이것저것 (0) | 2011.12.08 |
20111208_배열과 포인터, 동적배열 할당 (0) | 2011.12.08 |