객체 배열과 객체 포인터 배열
Person arr[3];
Person *parr = new Person[3];
객체로 이루어진 배열로 배열 생성시 객체가 함께 생성됨
== 객체 배열
(이 경우 호출되는 생성자는 default 생성자)
즉, chpt6 에서 다뤘던 내용에 의하면 해당 객체에 defult 생성자가 없을 경우 컴파일러가 에러를 발생시킴.
이 문제의 경우 해결 방법으론 두 가지를 제시할 수 있다.
- 기본 생성자 명시하기
- 오버로딩만 사용할 경우 default 파라미터 설정하기
Person *arr[3];
arr[0] = new Person(name, age);
arr[1] = new Person(name, age);
arr[2] = new Person(name, age);
객체를 저장할 수 있는 포인터 변수르 이뤄진 배열
== 객체 포인터 배열
(이 경우 별도의 생성(생성자 호출) 과정을 거쳐야 함)
배열 자체가 객체로 이루어진 배열이냐
객체의 주소를 담을 수 있는 공간으로 이루어진 배열이냐
차이
this 포인터의 이해
this 포인터는 컴파일 타임에 실제 값을 갖지 않고, 런타임에 객체 인스턴스가 생성될 때 해당 인스턴스의 주소로 설정된다.
왜냐하면 this 포인터는 this 가 사용된 객체 자신의 주소값을 정보로 담고 있는 포인터이기 때문
this == 현재 객체 인스턴스를 가리키는 지역 포인터이며, 비정적 멤버 함수 내에서 암묵적으로 사용 가능하다.
컴파일 시점 = this가 현재 클래스의 인스턴스를 가리켜야 한다는 정보만 있고, 객체 인스턴스의 실제 메모리 주소는 런타임에 결정된다
즉, this 포인터는 객체 생성 시점에서 해당 인스턴스의 주소를 받아 비정적 멤버 함수 내부에서 사용되며,
생성 이전에는 그 주소를 알 수 없다.
비정적 멤버함수
- static 키워드가 붙지 않은 일반적인 클래스 멤버 함수
- 객체 인스턴스를 통해서만 호출
- 내부에서 this 포인터를 통해 현재 객체의 멤버 변수에 접근
구분 | 비정적 멤버 함수 | 정적 멤버 함수(static) |
객체 필요 여부 | 객체가 필요함 (MyClass obj; obj.method();) | 객체 없이 호출 가능 (MyClass::method();) |
this 포인터 | 사용 가능 (내부에서 this 사용 가능) | 없음 (this 사용 불가) |
멤버 변수 접근 | 객체 멤버에 직접 접근 가능 | 객체 멤버 접근 불가능 (정적 멤버에만 접근 가능) |
메모리 상 위치 | 객체마다 개별적으로 존재 | 클래스 단위로 1개만 존재 |
this 포인터의 활용
this->num1 은 멤버 변수의 num1 을 의미
this 즉, 객체의 주소 값으로 접근할 수 있는 대상은 멤버변수 뿐
Self-reference 의 반환
객체 *this = 객체 인스턴스
this = 객체의 주소
*this = 값(객체 그 자체)
즉, this 를 반환하면 객체 인스턴스의 주소가 반환 되는 것이고,
*this 를 반환하는 건 객체 그 자체를 반환 하는 것이기 때문에
여기서 더 나아가자면
My copy() {
return *this;
}
이 경우엔 받는 쪽은 객체 변수로 받거나 const 참조로 받을 수 있으며,
My& add(int x) {
this->x += x;
return *this;
}
이 경우엔 받는 쪽은 참조 타입이 일반적이나 객체 변수로도 받을 수 있음
단, 객체 변수로 받을 시 받는 쪽은 복사본을 생성해서 가지게 됨
당연하게도 두 케이스 모두 포인터로는 받을 수 없다.
'C++ > 윤성우의 열혈 프로그래밍 C++' 카테고리의 다른 글
윤성우의 열혈 C++ chpt9. (4) | 2025.07.21 |
---|---|
윤성우의 열혈 C++ chpt8. (0) | 2025.07.02 |
윤성우의 열혈 C++ chpt6. (2) | 2025.06.08 |
윤성우의 열혈 C++ chpt5. (0) | 2025.05.16 |
윤성우의 열혈 C++ chpt4. (0) | 2025.05.12 |