c++ static member function (정적 멤버 함수)
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 |
댓글
이 글 공유하기
다른 글
-
c++ 익명 객체 (anonymous)
c++ 익명 객체 (anonymous)
2020.10.30 -
c++ 친구 함수와 클래스 friend
c++ 친구 함수와 클래스 friend
2020.10.30 -
c++ static member 변수
c++ static member 변수
2020.10.29 -
c++ class 와 const
c++ class 와 const
2020.10.28