this에 관해 몰랐거나 알아도 정확한 이유를 몰랐던 것들
1. 멤버 함수 내에 this가 묵시적으로 삽입된다
Class Go
{
int num;
public:
void SetNum(int a)
{
this->num = a;
}
};
위와 같은 클래스가 있으면 컴파일러는 묵시적으로
Class Go
{
int num;
public:
void SetNum(Go* this, int a)
{
this->num = a;
}
}
이런식으로 this를 삽입한다
2. static 멤버 함수 내에서 this를 사용할 수 없는 이유
하지만 static 멤버 함수에 대해서는 this를 삽입하지 않아서 static 함수내에서 this를 사용할 수 없다. 왜 static 함수에 대해선 this를 삽입해주지 않는가? this는 객체 자기 자신을 가리키는 포인터인데, static 멤버 변수나 함수는 객체 단위로 메모리 할당되는 것이 아닌, 클래스 단위로 할당되는 것이기 때문이다. 그래서 애초에 자기 자신이라는 개념이 없다 [2].
호출할때도 보면 객체->멤버 함수() 이런식으로 호출하는게 아니라 클래스 지정자 :: 로 호출했던 것을 생각해보면 납득이 간다. 그리고 애초에 static (멤버)변수는 프로세스가 시작하자마자 메모리에 할당된다. 이말도 결국 객체 생성과 무관하게 생성된다는 말과 통한다
3. static 멤버 함수 내에서 static이 아닌 멤버 변수에 접근할 수 없는 이유
1, 2번 이유 때문이다. 일반 멤버 함수, 변수 참조는 this를 이용해서 참조되는데 static 멤버 함수는 객체 생성과 무관하므로 (애초에 static 입장에서 this가 무슨 객체인지도 알수도 없다) 어떤 객체의 멤버 변수인지 알 방법이 없으므로 접근이 불가능하다.
Reference
[1] https://foxtrotin.tistory.com/111
[2] https://www.geeksforgeeks.org/memory-allocation-in-static-data-members-in-c/
[3] https://interviewsansar.com/can-static-function-access-non-static-variables-cpp/
'공부 > C || C++' 카테고리의 다른 글
C++ std::list vs std::vector (0) | 2022.09.26 |
---|---|
std::sort와 list::sort는 왜 따로 있을까? (0) | 2022.09.25 |
C++ 클래스 상속, 다중 상속, 가상 함수 그리고 다형성(Inheritance & virtual function & polymorphism) (1) | 2022.09.25 |
static 변수와 전역 변수와 비교 (0) | 2022.09.23 |
C++17 string_view (2) | 2022.09.19 |