소년코딩

멤버 초기화 (Member initialization)

c++ 11에서는 클래스의 일반 멤버 변수에 직접 기본 초기값을 할당할 수 있다. (즉, 초기화를 할 수 있다.)

#include <iostream>

class Rectangle
{
private:
    double m_Length = 1.0;  // or m_Length { 1.0 };
    double m_Width = 1.0;

public:
    void Print()
    {
        std::cout << "Length: " << m_Length << ", Width: " << m_Widt << std::endl;
    }    
}

int main()
{
    Rectangle x;
    x.Print(); // Length: 1.0, Width: 1.0

    return 0;
}

생성자에서 멤버 변수의 값을 지정하지 않는 경우 이렇게 멤버 초기화를 통해서 기본값을 할당하는 것이다.


주의해야 할 점은 기본값이 지정되어 있더라도 생성자 멤버 초기화 리스트가 가장 우선시 된다는 것이다.

#include <iostream>

class Rectangle
{
private:
    double m_Length = 1.0;  // or m_Length { 1.0 };
    double m_Width = 1.0;

public:
    Rectangle(double length, double width) : m_Length(length), m_Width(width)
    {
        // m_Length와, m_Width 변수는 생성자 멤버 초기화 목록에 의해 값이 초기화된다. (기본값이 사용되지 않는다.)
    }

    Rectangle(double length) : m_Length(length)
    {
        // m_Length 변수는 값이 초기화된다.
        // m_Width 변수는 기본값 1.0
    }

    void Print()
    {
        std::cout << "Length: " << m_Length << ", Width: " << m_Widt << std::endl;
    }    
}

int main()
{
    // Rectangle x; // Error: 기본 생성자는 이제 암시적으로 생기지 않는다.

    Rectangle y { 2.0, 3.0 };
    y.Print(); // Length: 2.0, Width: 3.0

    Rectangle z { 2.0 };
    z.Print(); // Length: 2.0, Width: 1.0

    return 0;
}

또한 멤버 초기화는

  • = 연산자를 이용한 복사 초기화 방식 int x = 5;
  • {}를 이용한 유니폼 초기화 방식 int x { 5 };

을 지원하지만

  • ()를 이용한 직접 초기화방식은 지원하지 않는다.

참고: 여러 가지 변수 초기화 방법


cpp 번역: 이 포스트의 원문은 https://www.learncpp.com/cpp-programming/8-5b-non-static-member-initialization/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기