[열혈 C++] Chap04: 클래스의 완성3 (배열과 this포인터)
4-1. 클래스와 배열
✏️객체배열
- 객체도 배열로 선언할 수 있다.
- 배열 선언의 경우 생성자가 호출되지만, 생성자에 인자를 전달하지 못한다.
- 따라서 배열 선언 후 초기화를 원한다면 일일이 해야한다.
class Person{
private:
char* name;
int age;
public:
Person(char* myname, int myage){ //구조체
int len = strlen(myname)+1;
name = new char[len];
age = myage;
}
Person(){ //생성자
name = NULL;
age = 0;
cout<<"Called Person()";
}
}
//배열 선언
Person person[10];
Person * ptrPerson = new Person[10]; //동적할당
✏️객체 포인터 배열
- 객체의 주소 값 저장이 가능한 포인터 변수로 이뤄진 배열
- 위 예제와 다르게 포인터 배열이므로 new를 사용하여 객체를 만들고 주소를 배열에 저장한다.
- new로 만들어준 객체 개수만큼 delete로 해방 시켜줘야 한다.
4-2. this 포인터
- 객체 자기 자신을 가리키는 용도의 포인터
- 예시
class SoSimple{
private:
int num;
public:
SoSimple(int n) : num(n){
cout << "num = " << num << ", ";
cout << "addtress = " << this << endl;
}
void ShowSimpleData(){
cout << num << endl;
}
SoSimple* GetThisPointer(){
return this; //이 문장을 실행하는 객체의 포인터 반환
}
};
int main(void){
SoSimple sim1(100);
SoSimple * ptr1 = sim1.GetThisPointer(); //객체 sim1에 의해 반환된 this를 ptr1에 저장
//this는 SoSimple의 포인터이므로 SoSimple형 변수에 저장
ptr1 -> ShowSimpleData();
return 0;
}
- 따라서, this는 객체 자신의 주소값을 의미한다.
- this는 주소 값과 자료형이 정해져 있지 않아서 사용자 정의로 잘 맞춰주면 유용하다.
✏️this 활용
- 매개변수의 이름과 멤버변수의 이름이 동일할 때, this를 사용해서 구분할 수 있음!
class ThisClass{
private:
int num; //멤버변수
public:
void ThisFunc(int num){ //매개변수
this->num = num; //this가 접근하고 있는 num은 멤버변수, 그 뒤에 나오는 num은 매개변수
num = 105; //매개변수의 값 변경
}
};
✏️Self-Reference
- *this 라고 하면 이 문장을 실행하는 자신의 포인터가 아닌, 객체 자신을 반환.
- 이때, 반환형이 참조형이면 객체 자신을 참조할 수 있는 참조 값이 반환됨.
class SelfRef{
private:
int num;
public:
SelfRef(int n) : num(n){
cout<<"객체 생성"<<endl;
}
SelfRef& Adder(int n){ //리턴 형이 참조형
num+=n;
return *this; //객체 자신을 참조하는 참조 값 반환
}
SelfRef& ShowNum(){
cout<<num<<endl;
return *this;
}
}