const
const
는 값을 상수로 선언할 수 있도록 도와주는 키워드다.
const
를 앞에 붙이면 값은 변경할 수 없게 된다.
const
의 선언 유무도 함수 오버로딩 조건에 해당이 된다.
class Test
{
public:
void Func() { }
void Func() const { }
};
- 객체도 상수화 할 수 있다.
- 이 객체를 대상으로는
const
멤버 함수의 호출만 허용한다.
class SoSimple
{
private:
int num;
public;
SoSimple(int n) : num(n){ } // 생성자
SoSimple& NotConstFunc(int n)
{
num+=n;
}
void ConstFunc() const // const 함수
{
cout << " Func() " << endl;
}
};
const SoSimple sim(20);
sim.NotConstFunc(); // 불가능
sim.ConstFunc(); // 가능
friend
- A 클래스가 B 클래스를 대상으로
friend
선언을 하면,
B 클래스는 A 클래스의 private
멤버에 직접 접근이 가능하다.
class A
{
private:
int num;
friend class B;
};
class B
{
public:
void Func(A &a)
{
cout<<" a's num : " << a.num << endl; // private 멤버에 접근 가능
}
};
B
에서 A
의 private
변수에 접근이 가능하다.
friend
선언은 정보은닉을 무너뜨리는 문법이다.
- 전역 함수, 클래스의 멤버 함수를 대상으로도
friend
선언이 가능하다.
- 함수에 대해
friend
선언을 해도 기본 함수 원형의 선언이 포함된다.
static
C에서의 static
- 전역 변수에 선언
- 선언된 파일 내에서만 참조를 허용하겠다는 의미
- 함수 내에 선언
- 한 번만 초기화된다.
- 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.
const static 멤버
class First
{
public:
const static int CNT = 0;
};
cout << First::CNT << endl; // 이름을 통해 접근한다.
static 멤버 변수(클래스 변수)
static
변수를 생성자에서 초기화하면 안 된다.
- 객체가 생성될 때마다 변수가 초기화되기 때문이다.
- 전역 변수로 변수를 선언 시 어디서든 접근할 수 있는데 이걸 제한할 수 있다.
static
멤버에 접근할 때에는 (클래스::변수)로 접근하는 것이 좋다.
- 멤버 변수에 접근하는 것 같은 오해를 없애기 위해서이다.
- 선언된 클래스의 모든 객체가 공유한다.
public
으로 선언이 되면, 클래스의 이름을 이용해서 호출이 가능하다.
- 객체의 멤버로 존재하는 것이 아니다.
class First
{
private:
static int num;
};
int First::num = 0;
static 멤버 함수
static
멤버 함수 내에서는 static
멤버 변수와 static
멤버 함수만 호출이 가능하다.
- 객체 생성과 아무런 관계가 없다.
- 선언된 클래스의 모든 객체가 공유한다.
- 객체의 멤버로 존재하는 것이 아니다.
mutable
const
함수 내에서의 값의 변경을 예외적으로 허용한다.
mutable
의 과도한 사용은 const
의 선언을 의미 없게 만들어버린다.
mutable int num2;
void CopyToNum2() const
{
num2 = num1;
}
explicit
- 암시적 변환을 막아준다.
- 대입 연산자를 이용한 객체의 생성 및 초기화는 불가능하다.
explicit SoSimple(const SoSimple ©) : num1(copy.num1), num2(copy.num2){}
SoSimple sim2 = sim1; // 에러! 암시적 변환 불가능
SoSimple sim2(sim1); // 가능