728x90
#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 main()
{
	Something s1;
	Something s2;
	cout << s1.getValue() << endl;
	// 접근 불가능함
	// cout << s1.s_value << endl;
    
	return 0;
}

 

 

 

변수가 선언된 곳이 private 가 아닌 public이라면

 

 

  • class::변수명으로 접근
  • class 인스턴스를 선언하고 인스턴스. getValue로 접근
  • 인스턴. 변수명으로 접근

이러한 방법들로 접근할 수 있습니다. 

public 이 private로 바뀌게 되면 class::변수명으로 접근이 불가능합니다.

 

접근이 불가능하게 되었을 때 int getValue 함수를 static으로 변경하고

static member function으로 접근할 수 있습니다.

 

static 은 this를 사용할 수가 없는데 이 말의 뜻은  this로 접근해야 하는 모든 value를 사용할 수 없다는 뜻입니다.

this를 사용한다는 것은 특정 인스턴스 주소를 받아서 그걸 사용하겠다는 뜻이고

정적으로 존재하는 메모리 변수에 한해서 접근이 가능합니다.

 

Something s1;
Something s2;

Something s1과 Something s2의 s_value의 메모리 주소 값은 각각 다릅니다.

하지만 함수의 주소값은 동일합니다.

 

동일한 이유는 클래스 안에 속해 있는 함수들은 어느 한 곳에 메모리를 차지하고 있다가

인스턴스가 함수를 실행시키면 인스턴스의 메모리값을 보내고 그 메모리값을 받아서 함수를 실행합니다.

 

 

#include <iostream>
using namespace std;

class Something
{
private:
	// 불가능함
	static int s_value = 1;
	int m_value;

 

 

static member 변수는 선언과 동시에 초기화를 할 수 없고

 

 

class Something
{
private:
	static int s_value;
	Something()
		: s_value(1024)
	{}

 

 

생성자에서도 초기화할 수 없습니다.

static member 변수를 class 안에서 초기화하려면 이너 클래스를 사용해야 합니다.

 

 

#include <iostream>
using namespace std;

class Something
{
public:
	class _init
	{
	public:
		_init()
		{
			s_value = 9876;
		}
	};
private:
	static int s_value;
	int m_value;
    
    // 이너 클래스를 스태틱으로 하나 생성
    static _init s_initializer;
};

// 클래스가 생성되면서 s_value 값을 초기화 합니다.
Something::_init Something::s_initializer;

int main()

 

 

member 함수의 메모리 주소 값을 가져오기

 

 

#include <iostream>
using namespace std;

class Something
{
	private:
	static int s_value;
	int m_value;
public:
	static int getValue()
	{
		return s_value;
	}
	int temp()
	{
		return this->s_value;
	}
};

int main()
{
	//잘못된예
	//int (Something:: * fptr1)() = s1.temp;
	//올바른예
	int (Something:: * fptr1)() = &Something::temp;
	//괄호꼭 감사주기
	cout << (s2.*fptr1)() << endl;;
    
	// getValue 는 something 에 들어있긴하지
	// 특정 인스턴스와 상관없이 실행 시킬수 있습니다.
	int (*fptr2)() = &Something::getValue;
	cout << fptr2() << endl;
	
	return 0;
}

 

 

static member 함수 인경우 인스턴스와는 상관없이 불러올 수 있습니다

728x90

'C++ > c++ - 따라하며 배우는 c++' 카테고리의 다른 글

c++ 익명 객체 (anonymous)  (0) 2020.10.30
c++ 친구 함수와 클래스 friend  (0) 2020.10.30
c++ static member 변수  (0) 2020.10.29
c++ class 와 const  (0) 2020.10.28
c++ 클래스 코드 와 헤더파일  (0) 2020.10.28