하 개 오랜만에 글쓴다....
한국인을 위한 코드 미리보기
#include <iostream>
class Object
{
private:
static int m_obejctCount;
const char* m_name;
public:
Object(const char* _name)
{
++m_obejctCount;
m_name = _name;
std::cout << "CreateObject (" << m_name << ")\n";
}
~Object()
{
--m_obejctCount;
std::cout << "DeleteObject (" << m_name << ")\n";
}
static int GetObjectCount()
{
return m_obejctCount;
}
static void DestroyObject(Object* _target)
{
delete _target;
}
};
int Object::m_obejctCount = 0;
int main()
{
Object* a = new Object("Object1");
Object* b = new Object("Object2");
Object* c = new Object("Object3");
Object::DestroyObject(c);
std::cout << "Object Count : " << Object::GetObjectCount() << "\n";
}
먼저 알아가야 할 것..
밑줄 << 이렇게 밑줄 쫙 그어놓은건 ㅈㄴ 중요한거고
배경 << 이렇게 배경해놓은거는 그냥 한번 봤으면 좋겠다는 정도고
밑줄배경 << 이건 그냥 개 ㅈㄴ게 ㅁㅊ 레전드로 중요한거다 다른거 안봐도 이건 봐줍메 제발
class내에서 변수에 static을 붙였다 = 정적멤버변수
class내에서 함수에 static을 붙였다 = 정적멤버함수
(이게 ㅈㄴ게 중요!!!!!!) static은 전역변수, 함수 취급을 받는다. 하지만 class 내부에 멤버로 주게 될 경우 그냥 그 class 내부에서만 쓸 수 있게 한정해줄 뿐이다. 너무 어렵게 생각하지 말자... 첨에 이 개념을 못가져가서 많이 헷갈렸다.
static은 프로그램 시작시 할당되는데, 문제는 class객체의 생성 전에 할당된다는 것이다....
때문에 정적멤버변수는 class안에서 초기화를 못한다...(class 내부에서 해보고싶으면 해보자... 내 기억엔 에러뜸...)
따라서 정적멤버변수는 전역범위에서 따로 초기화를 해줘야 한다!!
그리고 위와 같은 이유로 멤버함수도 당연히 this포인터를 받지 못한다...
따라서 this->m_name과 같이 정적멤버함수는 비정적멤버변수에 접근하지 못한다.
근데 ㅈㄴ 웃긴게... 위에 사진처럼 정적멤버함수에 매개변수로 자신의 class를 자료형으로 줄 수 있음... 심지어 위에 사진에 있는 _target의 비정적멤버변수도 사용 가능. (이 순간 "아니 ㅅㅂ!! this는 못쓰는데 이건 어캐 씀?" 라는 의문을 가짐)
당연히 static은 프로그램 시작 시 할당되는데.... class의 존재여부를 모르는게 당연한거 아닌가? 해서 교수님한테 물어봄ㅋㅋ
교수님왈, 매개변수를 받아 쓰는건 초기화 이후의 과정이므로... 상관없다... 라는 느낌으로 말하셨는데 느낌만 알겠고 설명을 못하겠다...
자 여기까지 static의 멤버변수와 멤버함수에 대한 설명을 다 했다! 라고 하고싶은데 중요한게 하나 더 남아있음..ㅇㅇ
위에서 설명했지만 class내의 static도 전역변수,함수라고 생각하라고 했는데, 말 그대로 객체가 여러 개여도 정적 멤버는 하나밖에 존재할 수 없다.
따라서 위 사진에 a, b, c객체가 m_objectCount의 값을 공유한다는 것이다.
더 쉽게 말하면 그냥 m_objectCount라는 전역변수가 있는데, Object라는 class 내에서만 쓸 수 있는 것 뿐이다. 때문에 출력해보면 정적멤버변수인 ObjectCount가 생성(+1)-생성(+1)-생성(+1)-삭제(-1) = 2가 나오는 것이다!
하 적다보니 귀찮아서 그냥 대충 설명하게 된다... 알아서 잘 이해하셨길...
'프로그래밍 > C++' 카테고리의 다른 글
[C++] friend에 대해 알아보자.araboza (0) | 2024.06.12 |
---|---|
[C++] const, 근데 class를 곁들인 (0) | 2024.06.11 |
[C++] 헤더를 미리 컴파일 하는 방법 (0) | 2024.04.11 |
[C++] sprintf_s()를 사용해 실수와 정수를 문자열에 담기 (0) | 2024.04.08 |
[C++] precision() 소수점 자리를 제한하여 출력하기 (0) | 2024.03.10 |