Inflearn Community Q&A
this와 *this
Resolved
Written on
·
239
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++
Answer 1
1
Rookiss
Instructor
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이 필요한데 그건 일단 넘어가시기 바랍니다.




