본문 바로가기

개발공부/C++

정적 멤버

#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