객체를 다루기 위해 객체에 대한 포인터 변수를 선언!
이러한 포인터 변수로 객체의 멤버 변수를 읽고 값을 쓰거나 멤버 함수를 호출할 수 있다.
Circle donut;
double d = donut.getArea();
Circle *p; // 객체에 대한 포인터 선언
p = &donut; // 포인터에 객체 주소 저장
d = p->getArea(); // 맴버 함수 호출
객체에 대한 포인터 변수 선언
포인터 변수에 객체 주소 지정
포인터 변수를 선언할 때 다음처럼 객체의 주소로 초기화 할 수도 있다.
(초기화 하지 않은 객체 포인터를 이용하면 오류 발생 : null pointer assignment 발생. 왜냐하면 아무 객체도 가리키지 않고 있기 때문!)
Circle* p = &donut; // 포인터 변수 선언 시 객체 주소로 초기화
포인터를 이용한 객체 멤버 접근
Circle circleArray[3]; //객체 배열 생성
circleArray[0].setRadius(10);
circleArray[1].setRadius(20);
circleArray[2].setRadius(30); //배열의 각 원소 객체의 맴버 접근
Circle circleArray[3] = {Circle(10), Circle(20), Circle()};
이제부터 중요한 것이니라.. 정신 차리시게..
int *p = new int [5]; //크기가 5인 정수형 배열의 동적 할당
if (!p)
return; //메모리 할당 실패시 p는 null을 반환하기에 먼저 검사
for (int i = 0; i < 5; i++)
p[i] = i; // 배열에 순서대로 0 1 2 3 4 기록
delete [] p; // 배열 메모리 반환. 이때 포인터는 살아있다..!
이 포인터가 가리키는 곳에 더이상 접근하면 안됨.
int *pArray = new int [] {1, 2, 3, 4}
배열일때만 delete [] q;
보통은 그냥 delete q;
delete 포인터변수;
<주의!!!> delete 사용 시, 포인터변수는 반드시 new를 이용하여 동적 할당받은 메모리의 주소여야 한다.
[잠깐!] Circle waffle; 과 Circle waffle()의 차이점(177pg)
Circle *pArray = new Circle[3]; // 3개의 Circle 객체 배열의 동적 생성
Circle *pArray = new Circle[3] {Circle(1), Circle(2), Circle(3)} // 3개의 Circle 객체를 반지름 1, 2, 3으로 각각 초기화
delete [] 포인터변수; // 포인터 변수가 가리키는 배열을 반환.
this가 필요한 경우
(1) 맴버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓기 위해
(2) 객체의 멤버 함수에서 객체 자신의 주소를 리턴할 때. '연산자 중복' 때 많이 사용됨! (아니 연산자 중복 그게 뭔데~~ 기아악 7장에서 다시 정리하자.)
this 의 제약 조건
(1) 클래스의 멤버 함수에서만 사용 가능
(2) 멤버 함수라도 정적 멤버 함수 (static member function)은 this 사용 불가능... 정적 멤버 함수는 객체가 생성되기 전에 호출될 수 있으며, 정적 멤버 함수가 실행되는 시점에서 '현재 객체'는 존재하지 않을수 있기 때문. (static 멤버함수는 5장에서 다룸)
(정적맴버함수에 대해 공부하고 나면 this 를 왜 쓰는지 알 수 있게 될것이다..!)
컴파일러는 this를 어떻게 처리? (189pg)
<<<<<<<<<정 리 필 요 ! >>>>>>>>>>>>