Programming | 프로그래밍 언어/C++

const, friend, static, mutable, explicit

gyunnnnnn 2022. 11. 27. 00:13

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에서 Aprivate변수에 접근이 가능하다.
  • friend 선언은 정보은닉을 무너뜨리는 문법이다.
    • 필요한 상황에서만 사용해야 한다.
  • 전역 함수, 클래스의 멤버 함수를 대상으로도 friend 선언이 가능하다.
  • 함수에 대해 friend 선언을 해도 기본 함수 원형의 선언이 포함된다.

static

C에서의 static

  • 전역 변수에 선언
    • 선언된 파일 내에서만 참조를 허용하겠다는 의미
  • 함수 내에 선언
    • 한 번만 초기화된다.
    • 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.

const static 멤버

  • 선언과 동시에 초기화가 가능하다.
class First
{
public:
    const static int CNT = 0;
};
cout << First::CNT << endl; // 이름을 통해 접근한다.

static 멤버 변수(클래스 변수)

  • static 변수를 생성자에서 초기화하면 안 된다.
    • 객체가 생성될 때마다 변수가 초기화되기 때문이다.
  • 전역 변수로 변수를 선언 시 어디서든 접근할 수 있는데 이걸 제한할 수 있다.
  • static 멤버에 접근할 때에는 (클래스::변수)로 접근하는 것이 좋다.
    • 멤버 변수에 접근하는 것 같은 오해를 없애기 위해서이다.
  1. 선언된 클래스의 모든 객체가 공유한다.
  2. public으로 선언이 되면, 클래스의 이름을 이용해서 호출이 가능하다.
  3. 객체의 멤버로 존재하는 것이 아니다.
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 &copy) : num1(copy.num1), num2(copy.num2){}
SoSimple sim2 = sim1; // 에러! 암시적 변환 불가능
SoSimple sim2(sim1); // 가능

'Programming | 프로그래밍 언어 > C++' 카테고리의 다른 글

가상 함수  (0) 2023.01.16
C++에서 상속에 대해 정리  (0) 2023.01.13
Dangling Pointer  (0) 2022.11.19
C++ STL 벡터, 리스트, 덱 비교  (0) 2022.11.18
복사 생성자  (0) 2022.11.13