#include <iostream>
using namespace std;
class Something
{
private:
static int s_value;
public:
static int getValue()
{
return s_value;
}
int temp()
{
return this->s_value;
}
};
int Something::s_value = 1024;
int main()
{
cout << Something::getValue() << endl;
//정적멤버함수이므로 객체를 만들지않고 접근이 가능하다.
Something s1, s2;
cout << s1.getValue() << endl;
//객체를 만들고 접근하는 것은 당연히 가능하다.
/*cout << s1.s_value << endl;*/
//위 주석은 접근제한자(private)때문에 접근이 불가하다.
int (Something:: * fptr1)() = &Something::temp;
cout << (s2.*fptr1)() << endl;
//함수의 주소를 받아서 포인터로 사용(접근)하는 것이 가능하다.
return 0;
}
1024
1024
1024
참고로 C++에서는 일단 static constructor를 지원하지 않는다.
그래서 inner class를 사용한다.
#include <iostream>
using namespace std;
class Something
{
public:
//inner class
class _init
{
public:
_init()
{
s_value = 9876;
}
};
//inner class를 public으로 작성했다.
private:
static int s_value;
int m_value;
static _init s_initializer;
//inner class를 field로 가진다.
public:
static int getValue()
{
return s_value;
}
int temp()
{
return this->s_value;
}
};
int Something::s_value = 1024;
Something::_init Something::s_initializer;
//자료형은 Something 클래스가 가진(inner) _init이고
//변수이름은 s_initializer이고 객체로 선언하면서
//생성자를 통해 s_value를 바로 초기화하고 있다.
int main()
{
cout << Something::getValue() << endl;
Something s1, s2;
cout << s1.getValue() << endl;
/*cout << s1.s_value << endl;*/
int (Something:: * fptr1)() = &Something::temp;
cout << (s2.*fptr1)() << endl;
return 0;
}
조금 번거롭긴 하지만 정적(static)변수를 클래스내부에서 초기화하는 방법이다.
컴파일러에서는 전역(global)변수처럼 다루기 때문에 클래스 외부에서 말 그대로 전역(global)변수를 초기화하는 것처럼
초기화하면 잘 작동된다. 이에 관한 이슈는 조금 어려워서 더 공부해봐야할 것 같다.
'개발공부 > C++' 카테고리의 다른 글
형변환을 오버로딩하기 (0) | 2019.10.23 |
---|---|
키워드 : friend (0) | 2019.10.23 |
다양한 반환 값들 (0) | 2019.10.22 |
다중포인터와 동적 다차원 배열 (0) | 2019.10.22 |
포인터와 참조의 멤버 선택 (0) | 2019.10.22 |