본문 바로가기

Algorithm 문제 풀이/C++

[C++] this 포인터 & 빈(void) 생성자

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 생성자)

  1. 생성자를 정의하지 않으면 빈 생성자가 자동으로 추가된다. 즉 개발자가 생성자를 만들지 않아도
    객체 생성시에 생성자가 자동으로 실행된다.
  2. 생성자를 정의하면 빈 생성자는 추가되지 않는다.
  3. 매개변수가 있는 생성자를 정의한 후에는 빈 생성자가 자동으로 추가되지 않기 때문에 빈 생성자가
    필요할 때는 반드시 정의해야한다.
#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 포인터를 생략해서 표현한다.