프로그래밍 언어/C++
C++ 자기 자신 참조 (this)
ShovelingLife
2022. 7. 28. 10:55
아래 코드를 살펴보면 Set 함수에서 멤버 변수 val에 파라미터로 넘어오는 값을 대입하고자 하는데 공교롭게도 val을 파라미터로 넘어오는 값으로 인식한다 val은 초기화가 안됐으므로 쓰레기값이 출력될거다.
#include <iostream>
using namespace std;
class Parent
{
int val;
public:
void Set(int val)
{
val = val;
}
int Get() const
{
return val;
}
};
int main()
{
Parent parent;
parent.Set(10);
cout << parent.Get() << endl;
return 0;
}
해당 부분을 this로 바꿔주면 정상 작동된다.
#include <iostream>
using namespace std;
class Parent
{
int val;
public:
void Set(int val)
{
//val = val;
this->val = val;
}
int Get() const
{
return val;
}
};
int main()
{
Parent parent;
parent.Set(10);
cout << parent.Get() << endl;
return 0;
}
생성자 일 때도 유용하게 쓰여진다.
#include <iostream>
using namespace std;
class Parent
{
int mVal = 0;
public:
Parent(int Val):mVal(Val)
{
cout << "기본 생성자 호출" << endl;
}
Parent(const Parent& Ref)
{
cout << "복사 생성자 호출" << endl;
this->mVal = Ref.GetVal();
}
~Parent()
{
cout << "소멸자 호출" << endl;
}
Parent& operator=(const Parent& Ref)
{
cout << "대입 연산자 오버로딩 호출" << endl;
if (*this != Ref)
this->mVal = Ref.GetVal();
return *this;
}
bool operator!=(const Parent& Ref)
{
return this->mVal != Ref.GetVal();
}
public:
int GetVal() const
{
return mVal;
}
void Print()
{
cout << "현재 값 : " << mVal << endl;
}
};
int main()
{
Parent* p1 = new Parent(5);
Parent p2(10), p3(15);
// 대입 연산자 오버로딩
p2.Print(); p3.Print();
p2 = p3;
p2.Print();
// 복사 생성자
Parent p5(p3);
p5.Print();
delete p1;
return 0;
}