C++

This

Nin 2020. 12. 12. 16:38

 

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