struct Player
{
int Att;
int Hp;
void Attack(const Player& _Att,const Player& _Def)
{
_Def.Hp -= _Att.Att; //에러
}
};
위의 코드에서 _Def.Hp -= _Att.Att; 의 코드는 에러가 난다.
Attack의 두번째 인자에 const를 붙였고 _Def의 들어온 사용자 정의 자료형 내부의 멤버변수인 Hp의 값을 변경하려고 해서이다.여기에서 알수 있듯이 사용자 정의 자료형에 const를 붙이면 내부의 멤버변수 모두에 const가 붙는것이다.
struct Test
{
int Number;
void Func()
{
++Number;
}
};
int main()
{
Test NewTest = {0}; // 만드는 순간 메모리에 NewTest와 자기의 Number 1개 생성
NewText.Func();
NewText.Func();
NewText.Func();
}
위의 코드는
struct Test
{
int Number;
}
void Func(Test* TestPtr)
{
TestPtr->Number += 1;
}
이와 같은식으로 실행된다.
그럼으로 실행시 결과갚은 둘다 Number에는 3의 값이 들어간다
int main()
{
Test NewTest1 = {0}; // NewTest1의 Number 1개 생성
NewTest1.Func();
NewTest1.Func(); // 여기서 Number는 2
Test NewTest2 = {0}; // NewTest2의 Number 1개 생성
NewTest2.Func(); // 여기서 Number는 1
}
여기서 생각해보면 NewTest1와 NewTest2는
각각 똑같은 이름의 Number를 하나씩 사용하면서
같은 멤버 함수인 Func를 사용하면서 그 안에서 Number의 값을
++ 해주고 있는데 어떻게 구분하며 각각 다른값을 가지고 있는걸까?
사용자 정의형 내부에 함수(멤버 함수)를 만들게 되면
무조건 하나의 인자값이 생기고 생략되어있는것이다.
void Func(Test* const this) <- 이 인자값이 생략되있다.
NewTest1.Func(&NewTest1) 이렇게 사용되고 있는거라고 볼수있다.
함수동작에서도 this->Number += 1 이렇게 사용되고 있는거다.
Test* const this : *의 뒤에 const가 붙었음으로 주소값을 변경할 수 없다
this = nullptr 당연히 안된다.
여기서 보듯이 this 란 자기 자신을 표현하는 것이고 this는 자료형* const형이다.
포인터 이기때문에 값을 끌어내려면 *this를 해주면 값을 끌어낼수있다.
'C++' 카테고리의 다른 글
nullptrObject (0) | 2020.12.13 |
---|---|
함수 호출 규약 (0) | 2020.12.13 |
ObjectInit,Constructor(생성자) (0) | 2020.12.13 |
접근제한자 (0) | 2020.12.13 |
객체지향 (0) | 2020.12.10 |