C++

nullptrObject

Nin 2020. 12. 13. 02:22
class Test
{
public:
	int Number;
    
public:
	void Plus(int Left, int Right)
    {
    	int Value = Left + Right;
    	retrun Value;
    }
}


int main()
{
   Test* Ptr = nullptr;
   Ptr->Number = 100; // 터진다
    
   Ptr->Plus(100, 200); // 이건 가능하다

   int* Ptr = 0; // nullptr 익셉션이라고 한다
    
   (*Ptr) = 100; //누구도 가리키지 않는 참조를 사용하지 마라
}

 

왜 Ptr->Number = 100은 에러가 나고 Ptr->Plust(100, 200)은 실행이 되는지 생각해보자.

우선 Test* Ptr = nullptr 에서 객체의 주소값을

nullptr로 해줬기 때문에 이 Ptr은 주소값을 아무것도

가리키고 있지 않다가 된다. 다음으로 Ptr->Number = 100을 해주면 에러가 난다.

Ptr 객체의 주소값으로 가서 거기에 있는 객체의 멤버 변수 Number를 100으로 해주는건데 Ptr의 주소값이 없기때문에 에러가 나는게 아닐까 라고 생각한다. 사실 저 방식을 풀어보면 객체 내부로 들어가서 this->Number = 100 이라고

생각 되는데 여기서 자기자신(this) 주소값이 가르키는게 없기때문에 에러가 나는게 아닐까..

Ptr->Plus(100, 200) 이 함수호출은 왜 가능할까??

멤버 함수의 동작 원리는 전역 함수처럼 사용되는데 

컴파일 시 딱 한번 메모리에 할당되어 사용되고 전역함수의

첫번째 인자에 객체의 주소를 받아서 사용하는데  Plus 함수에는 객체의 데이터를 사용하지 않았기 때문에 문제없이 실행된다고 생각..

 

정답 : this를 참조했는지 안했는지의 차이이다.

'C++' 카테고리의 다른 글

DefaultParameter(기본인자)  (0) 2020.12.13
OverLoading , 컴파일 4단계,네임맹글링  (0) 2020.12.13
함수 호출 규약  (0) 2020.12.13
ObjectInit,Constructor(생성자)  (0) 2020.12.13
접근제한자  (0) 2020.12.13