inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

this와 *this

해결된 질문

250

wlfansdl

작성한 질문수 32

0

안녕하세요
강의를 거의 다 듣다가 헷갈리는 개념이 있어서 복습중입니다.
 
this와 *this에 대해서 잘 이해가 안되는 부분이 있어서 질문 드립니다.
아래와 같이 예시 클래스를 만들어 봤을 때
(멤버변수들은 제가 메모리에서 쉽게 찾아보려고 연속되게 넣은거고 의미 없습니다)
class Simple
{
public:
	Simple& operator=(const Simple& rhs)
	{
		if (this == &rhs)
			return *this;
	}

private:
	int mNum = 1;
	int mNum2 = 2;
	int mNum3 = 3;
	int mNum4 = 4;
	int mNum5 = 5;
};
궁금한 점은 *this는 객체 자신이다 라는게 과연 정확히 뭘까가 의문입니다.
 
this는 자신이 속한 객체의 포인터인것은 이해가 가지만
*this 객체를 자신을 넘긴다는게 어떻게 가능한지 어떤 의미인지 의문입니다.
 
시작주소 + 어떠한 객체에 대한 헤더정보가 넘어가는것인가요 ?
 
제가 헷갈리는 이유는 예를 들어서
 
	int num = 3;
	int* ptr = #
	cout << *ptr << endl;

	int arr[10] = { 0 };
	int* arrptr = arr;
	cout << *arrptr << endl;
 
변수와 배열에 대해서 포인터를 만들었을 때
여기서 *ptr은 값 3이고,
 
*arrptr은 첫번째 원소의 값 0이지
int arr[10]이거나 arr의 첫번째 원소의 주소가 아니기 때문에
 
*this가 객체 자신을 넘긴다 ?라는게 어떤 의미일지 이해가 잘 안갑니다.
결국 return 값으로 넘길수 있는것은 뭔가 한개일테고 데이터멤버 첫번째가 값이 아니면 시작주소 아닐까 싶은데.
 
만약에 단순히 시작주소라면 this ==&rhs 이 문장은 *this == &rhs로 바꿔도 똑같을테고요..
 
결론적으로 질문은 *this가 객체 자신을 가리킨다는것이 어떤 의미인지 ?? 입니다.
객체는 일대일 대응이 안되다보니 가리킨다 라는 개념이 안 와닿습니다.
시작주소라고 하면 ? 그냥 포인터랑 다른점이 없는거 같구요. 뭔가 헤더 정보를 가지고 있는것인가요.
 
+ 구조체로 테스트 해보려고하면
C++ 이러한 피연산자와 일치하는 연산자가 없습니다. 피연산자 형식이 std::ostream << myStruct입니다.
아예 되지가 않습니다.
조사식으로 *strptr == my인 것은 확인했습니다. 여전히 어떻게 가능한지? 잘 이해는 안되네요 ㅠ
	struct myStruct my;
	struct myStruct* strptr = &my;
	cout << *strptr << endl;

C++

답변 1

1

Rookiss

1)

int number = 3;
int* ptr = &number;
라면 ptr은 int* 포인터 (주소 + int타입)이기 때문에
*ptr을 하면 역참조를 해서 실제로 3이라는 값을 의미합니다.

마찬가지로,
Simple a;
Simple* ptr = &a;
라면 ptr은 Simple* 포인터 (주소 + Simple 타입)이기 때문에
*ptr을 하면 역참조를 해서 실제로 Simple 이라는 구조체 값을 의미합니다.

딱 1개의 시작값이 아니라, Simple을 구성하는 int 5개가 모두 포함되는 풀박스 그 자체가 되는 것이죠.
마찬가지로 this는 Simple* 이기 때문에 그냥 주소값이고
*this를 하면 Simple 타입입니다.
오해하신 것처럼 [데이터멤버 첫번째 값 or 시작주소]가 아니며
[모든 데이터 멤버를 합친 Simple이라는 타입] 그 자체입니다.

Simple a;
Simple& b = a; // 참조
Simple c = a;  // 복사

위는 사용법은 간단하죠? 사실 이거와 동일합니다.

Simple a; 대신 *this라고 생각하시면 됩니다.
Simple& b = *this;를 하면 복사가 되진 않고 참조를 하게 될 것이고
Simple b = *this;를 하면 실제 값을 복사하게 되겠죠.

2)
ostream operator<<에 대해 overloading이 필요한데 그건 일단 넘어가시기 바랍니다.

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

559

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

453

1

strcpy() 구현 관련 질문

0

534

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

475

1

클래스 타입의 포인터 질문합니다

0

559

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

503

1

템플릿 특수화 관련 질문

0

389

1

포인터 관련 질문합니다!

0

270

1

Unable to start assembler. Check your settings.

0

848

2

cpu선택

0

548

1

포인터 질문이 있습니다

0

331

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

589

1

iterator 삭제관련

0

415

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

317

0

스택 프레임 질문합니다!

2

312

1

오른값 참조 in 게임

0

391

0

동적할당 질문이 있습니다

0

457

1

안녕하세요 메모리에 대해 질문드립니다.

0

312

1

함수객체 의 매개변수

0

365

1

복사생성자

0

439

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

430

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

359

1

스택 오버플로우

2

801

1