C에서의 static
- 전역변수에 선언된 static
- 선언된 파일 내에서만 참조를 허용하겠다는 의미
- 지역변수(함수 내)에 선언된 static
- 한번만 초기화되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다
- 초기화하지 않으면 자동으로 0으로 초기화 된다
만약 C++에서 두 객체가 있을때, 각 객체가 생성될 때 마다 몇 번째로 생성된 클래스인지 알아보기위한 전역변수가 각각 cnt1, cnt2가 있다면 어떤 것이 어떤 객체를 위한 변수인지 알 수 있는 방법은 이름을 통해서 구분하는 방법뿐이다. 때문에 이러한 제한을 지켜줄 장치가 아무런 장치도 존재하지 않는다.
static member(정적 멤버)와 static member(상수 멤버)
static member variable
C++에서 정적 멤버란 클래스에는 속하지만, 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다.
멤버 변수가 정적으로 선언되면, 해당 클래스의 모든 객체에 대해 하나하나의 데이터만이 유지 관리 된다.
정적 멤버 변수는 클래스 영역에서 선언되지만, 정의는 파일 영역에서 수행된다.
이러한 정적 멤버 변수는 외부 연결을 가지므로 여러 파일에서 접근할 수 있다.
정적 멤버 변수에도 클래스 멤버의 접근 제한 규칙이 적용되므로, 클래스의 멤버 함수나 friend만이 접근할 수 있다.
하지만 정적 멤버 변수를 외부에서도 접근할 수 있게 하고 싶으면, 정적 멤버 변수를 public영역에 선언하면 된다.
#include <iostream>
class Count1
{
private:
static int cnt;
public:
Count1()
{
cnt++;
std::cout << "Count1 : " << cnt << " 번째" << std::endl;
}
~Count1();
};
int Count1::cnt = 0; // static 멤버 변수의 정의 및 초기화
class Count2
{
private:
static int cnt;
public:
Count2()
{
cnt++;
std::cout << "Count2 : " << cnt << " 번째" << std::endl;
}
Count2(Count2& copy)
{
cnt++;
(void)copy;
std::cout << "Count2 : " << cnt << " 번째" << std::endl;
}
~Count2();
};
int Count2::cnt = 0; // static 멤버 변수의 정의 및 초기화
int main()
{
Count1 c1;
Count2 c2_1;
Count2 c2_2 = c2_1;
return 0;
}
static member function
C++에서는 클래스의 멤버 함수도 정적(static)으로 선언할 수 있다.
이렇게 선언된 정적 멤버 함수는 해당 클래스의 객체를 생성하지않고, 클래스 이름만으로 호출할 수 있다.
선언된 클래스의 모든 객체가 공유하고, public으로 선언되면 클래스의 이름을 이용해서 호출이 가능하며, 객체의 멤버로 존재하는 것이 아니다.
#include <iostream>
class Count
{
private:
std::string name;
static int cnt;
public:
Count(std::string _name)
{
name = _name;
cnt++;
std::cout << "Count1 : " << cnt << " 번째" << std::endl;
}
static int cnt_func()
{
//static 멤버함수에는 static 멤버변수와 static 멤버함수만 호출 가능
std::cout << cnt << std::endl;
}
~Count();
};
int Count::cnt = 0; // static 멤버 변수의 정의 및 초기화
int main()
{
Count1 c1;
return 0;
}
const member varible
상수 멤버변수는 한 번 초기화하면, 그 값을 변경할 수 없는 멤버 변수를 의미한다. 클래스 전체에 걸쳐 사용되는 중요한 상수에 사용하는 것이 좋다.
const 타입 멤버변수이름;
const member function
상수 멤버 함수란 호출한 객체의 데이터를 변경할 수 없는 멤버함수를 의미한다. 호출한 객체의 데이터를 단순히 읽기만 하는 멤버 함수는 상수 멤버 함수로 정의하는 것이 좋다.
함수의 원형 const;
const static member
클래스 내에 선언된 const 멤버변수의 초기화는 이니셜라이저를 통해야만 가능하다. 하지만 const static으로 선언되는 멤버변수는 선언과 동시에 초기화가 가능하다