this 키워드 : 객체(해당 클래스의 멤버변수)를 가르키는 것
객체 주소값, 지역 변수 값, 인스턴트 변수 구분할 때 많이 사용
파이썬의 self와 유사한 개념(객체를 가르킴)
this 포인터
: 값이 결정되어 있지 않은 포인터
왜냐하면 this 포인터는 this가 사용된 객체 자신의 주소값을 정보로 담고 있는 포인터이기 때문이다.
this를 반환한다는 것은 이 문장이 실행하는 객체의 포인터를 반환하라는 의미이다.
그래서 반환형도 SoSimple* 형으로 선언된다.
#include <iostream>
#include <cstring>
using namespace std;
class SoSimple {
int num;
public:
SoSimple(int n) : num(n) {
cout << "num=" << num << ", ";
cout << "address=" << this << endl;
}
void ShowSimpleData() {
cout << num << endl;
}
SoSimple* GetThisPointer() {
return this;
}
};
int main(void) {
SoSimple sim1(100); // num=100, address=00CFFC38
SoSimple* ptr1 = sim1.GetThisPointer(); // sim1 객체의 주소 값 저장
cout << ptr1 << ", "; // 00CFFC38
ptr1->ShowSimpleData(); // 100
SoSimple sim2(200); // num=200, address=00CFFC20
SoSimple* ptr2 = sim2.GetThisPointer(); // sim2 객체의 주소 값 저장
cout << ptr2 << ", "; // 00CFFC20
ptr2->ShowSimpleData(); // 200
return 0;
}
객체 sim1에 의해 반환된 this를 ptr1에 저장하고 있다. 이때 this는 SoSimple의 포인터이므로 SoSimple형 포인터변수에 저장해야한다.
빈 생성자(void 생성자)
- 생성자를 정의하지 않으면 빈 생성자가 자동으로 추가된다. 즉 개발자가 생성자를 만들지 않아도
객체 생성시에 생성자가 자동으로 실행된다. - 생성자를 정의하면 빈 생성자는 추가되지 않는다.
- 매개변수가 있는 생성자를 정의한 후에는 빈 생성자가 자동으로 추가되지 않기 때문에 빈 생성자가
필요할 때는 반드시 정의해야한다.
#include <iostream>
using namespace std;
class TwoNumber {
private:
int num1;
int num2;
public:
TwoNumber() = default;
TwoNumber(int num1, int num2) {
this->num1 = num1;
this->num2 = num2;
}
void ShowTwoNumber() {
cout << this->num1 << endl;
cout << this->num2 << endl;
}
};
int main(void) {
TwoNumber two(2, 4);
TwoNumber two2;
two.ShowTwoNumber(); // 2 4
return 0;
}
설명
TwoNumber() = default;
매개변수가 void형으로 선언되는 디폴트 생성자는, 생성자가 하나도 정의되어있지 않을 때에만 삽입된다.
this->num1 = num1;
this->num2 = num2;
this -> num1은 멤버변수 num1을 의미한다.
객체의 주소 값으로 접근할 수 있는 대상은 멤버 변수이지 지역변수가 아니기 때문이다!
매개변수 num1, num2를 통해서 전달된 값이 멤버변수 num1, num2에 저장된다.
// 기존 코드
TwoNumber(int num1, int num2) {
this->num1 = num1;
this->num2 = num2;
}
// 멤버 이니셜라이저에서 this 포인터 사용
TwoNumber(int num1, int num2) : num1(num1), num2(num2)
※ 멤버 이니셜라이저에서는 this 포인터를 사용할 수 없다. 대신에 저장하는 변수는 멤버 변수로, 저장되는 값(소괄호 안의 변수는 매개변수로 인식한다.
this->num1
this->num2
this 포인터를 사용함으로써, 멤버 변수에 접근함을 명확히 하였다. 그러나 일반적으로 이러한 경우에는 this 포인터를 생략해서 표현한다.
'Algorithm 문제 풀이 > C++' 카테고리의 다른 글
[C++] 함수와 참조자 (0) | 2022.02.10 |
---|---|
[C++] 참조자(Reference) 이해하기 (0) | 2022.02.10 |
[C++] 데이터 입력 받기 (0) | 2022.02.08 |
[C++] C++의 시작 : "Hello World" 출력하기 (0) | 2022.02.08 |