멤버 초기화 (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 };
을 지원하지만
()
를 이용한 직접 초기화방식은 지원하지 않는다.
참고: 여러 가지 변수 초기화 방법
번역: 이 포스트의 원문은 https://www.learncpp.com/cpp-programming/8-5b-non-static-member-initialization/ 입니다.