C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사
| Computer_language/C++ 2009. 1. 12. 00:52C++에서 class 멤버 중 static으로 선언된 멤버는 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다.
위의 내용은 뭐... C++을 공부해본 사람들이라면 다 아는 내용이다.
그런데 여기서 사람들이 간혹 "class '선언'에 static" 만을 생각하고, "멤버함수의 '정의'의 static"을 모르고 지나가는 경우가 있다. 글 표현 능력이 없으므로 일단 보여주겠다.
#include <iostream> using namespace std; class CStaticTest { public: void test(void); }; int main(void) { CStaticTest a; CStaticTest b; cout << "a 인스턴스를 호출합니다." << endl; a.test(); cout << endl; cout << "b 인스턴스를 호출합니다." << endl; b.test(); return 0; } void CStaticTest::test() { static int a = 0; cout << a << endl; a = 1; } |
본인이 여기서 말하고 싶은것은 대부분 C++서적들이 class의 static 에 관한 내용을 맨 위에 문장
" C++에서 class 멤버 중 static으로 선언된 멤버는 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다."
으로 설명하고 있어 사용자에게 치명적인 오류를 불러 일으킬 수 있기 때문이다.
소스 내용을 보면 맴버 함수 test() '정의'에 static 변수가 선언 되어 있다. 그리고 각각의 객체 a, b로 선언되어 test()함수를 호출하고 있다. 이때 오해가 발생하는 것이다. "class 선언에 static 으로 선언된 멤버 변수가 아니니 단순히 C와 같이 함수에서만 사용되고...그러므로 객체에 따라 각각함수에 static 변수가 생성되겠군."...이다.
그러나 소스를 꼼꼼히 따져서 결과를 봐 보자....어떠한가? class 멤버 함수의 정의 내부에 선언된 static 또한 공유됨을 알 수 있다.
따라서 맨 위의 글을 조금 고친다면...
"C++에서 class( 멤버 변수, 멤버 함수의 선언 & 정의 )에 static 이 사용되면 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다."
가 정확하다라는 뜻이다.
(조금 위험한 생각이지만) C++에서 static 이 사용되면 무조건 공유된다. 라고 생각해 두는 것이 속 편한거 같다.
[출처] C++ class에서 함수정의에 사용된 static|작성자 정천사
'Computer_language > C++' 카테고리의 다른 글
oop 객체 지향 프로그래밍(Object Oriented Programming, OOP) (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |