Minwoo Dev.

[C++] 멤버 이니셜라이저(Member Initializer) 본문

C++

[C++] 멤버 이니셜라이저(Member Initializer)

itisminu 2024. 3. 17. 13:58
728x90
반응형
SMALL

x와 y 에 대한 점을 나타내는 Myclass라는 클래스가 있다고 하자.

보통 생성자를 통하여 값을 전달받아 사용하는 방식으로 코드를 작성하면 아래와 같을 것이다.

#include <iostream>
using namespace std;

class Myclass
{
private:
    int x;
    int y;

public:
    Myclass(int xpos, int ypos)
    {
        x = xpos;
        y = ypos;
    }

    void ShowPoint() const
    {
        cout << x << ", " << y << endl;
    }
};

int main(void)
{
    Myclass mypo1(3, 7);
    mypo1.ShowPoint();

    return 0;
}

 

 

위 코드에서 생성자 부분을 따로 잘라서 설명하겠다.

Myclass(int xpos, int ypos)
    {
        x = xpos;
        y = ypos;
    }

 

위처럼 코드를 작성하면, main 함수에서 

Myclass mypo1(3, 7);

 

위처럼 선언했을 때, xpos에는 3이, ypos에는 7이라는 값이 call-by-value로 전달된다.

그 값을 복사하여 x 에 xpos를, y 에 ypos 를 대입하는 것이다.

 

 

실행 결과

 

 

위처럼 클래스의 생성자에 초기화를 하는 경우에 , 멤버 이니셜라이저를 사용할 수 있다.

 

멤버 이니셜라이저(Member Initializer)

Myclass(int xpos, int ypos) : x(xpos), y(ypos)
    {
        // 공백
    }

 

멤버 이니셜라이저는 생성자의 초기화를 위처럼 하는 방식이다.

":"를 사용하여 클래스 내부변수인 x에는 xpos를, y에는 ypos를 전달한다는 의미이다.

 

멤버 이니셜라이저를 사용하면 멤버함수 내부는 공백으로 남는 경우가 많다.

 

 

실행 결과

 

결과도 같은 것을 확인할 수 있다.

 

위 코드만 본다면 멤버 이니셜라이저를 굳이 사용해야 할 이유를 못느낄수도 있다.

나도 이까지만 봤을 때는 그저 생성자를 초기화하는 또 하나의 방법이라고 생각했으니 말이다.

 

 

멤버 이니셜라이저(Member Initializer)로 const 상수 초기화하기

멤버 이니셜라이저의 좋은 점은 const 상수도 초기화할 수 있다는 점이다.

 

 

  • 멤어 이니셜라이저를 사용하지 않고 const 상수 초기화

만약, 멤버 이니셜라이저를 사용하지 않고 const 상수를 초기화한다면 ,

#include <iostream>
using namespace std;

class Myclass
{
private:
    const int x; // const로 선언하였다.
    const int y; // const로 선언하였다.

public:
    Myclass(int xpos, int ypos) // 멤버 이니셜라이저 사용 X
    {
        x = xpos;
        y = ypos; // 함수 내부에서 초기화 하는 모습임
    }

    void ShowPoint() const
    {
        cout << x << ", " << y << endl;
    }
};

int main(void)
{
    Myclass mypo1(3, 7);
    mypo1.ShowPoint();

    return 0;
}

 

 

이러한 에러가 발생할 것이다.

 

 

  • 멤버 이니셜라이저 사용하여 const 상수 초기화

하지만, 멤버 이니셜라이저를 사용한다면

#include <iostream>
using namespace std;

class Myclass
{
private:
    const int x;
    const int y;

public:
    Myclass(int xpos, int ypos) : x(xpos), y(ypos) // 멤버 이니셜라이저 사용
    {
        // 공백
    }

    void ShowPoint() const
    {
        cout << x << ", " << y << endl;
    }
};

int main(void)
{
    Myclass mypo1(3, 7);
    mypo1.ShowPoint();

    return 0;
}

 

 

 

에러가 발생하지 않고 초기화가 정상적으로 진행되었다.

이처럼 멤버 이니셜라이저는 const 변수를 초기화할 때 유용하게 사용된다.

 

 

728x90
반응형
LIST