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 |