공부/C || C++

static 멤버 함수가 static이 아닌 멤버 참조가 안되는 이유, static 멤버 함수에서 this를 사용할 수 없는 이유

sudo 2022. 9. 25. 14:44

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

 

C++ this포인터에 관하여

this란? -객체 자신의 포인터 -각 객체 속의 this는 다른 객체의 this와 다름 -컴파일러가 묵시적으로 삽입 선언함 -클래스 멤버 함수 내에서만 사용 가능 -static 멤버 함수에서 this 사용 불가 예제를

foxtrotin.tistory.com

[2] https://www.geeksforgeeks.org/memory-allocation-in-static-data-members-in-c/

 

Memory Allocation in Static Data Members in C++ - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

[3] https://interviewsansar.com/can-static-function-access-non-static-variables-cpp/

 

Can static function access non static variables in C++? – Interview Sansar

No, Static function of a class in C++ cannot access non-static variables, but, it can access static variable only. However, non-static member function can access static and non-static variable both. Static function is not associated with class object, mean

interviewsansar.com