반응형
member initializer list 필요성
• 멤버 데이터로 상수나 참조가 있는 경우
• 디폴트 생성자가 없는 타입이 멤버로 있는 경우
[예제] member initializer list 사용하지 않은 경우
상수와 참조 변수는 반드시 초기화 되어야 한다.
class Harbang
{
const int c;
int& r;
public:
Harbang(int c, int& r)
{
this->c = c; // error
this->r = r; // error
}
};
int main()
{
int n = 5;
Harbang h(5, n);
}
생성자 블록 안에 값을 대입해주었지만
초기화가 아니기 때문에 Build Error 발생
멤버 초기화 리스트로 문제를 해결할 수 있다.
[예제] member initializer list 적용
굳이 this 키워드 사용하지 않아도 멤버 변수인지 구분할 수 있다.
class Harbang
{
const int c;
int& r;
public:
Harbang(int c, int& r) : c{c}, r{r}
{}
};
int main()
{
int n = 5;
Harbang h(5, n);
}
[예제] 디폴트 생성자가 없는 경우
// 디폴트 생성자 X
class Harbang
{
int a, b;
public:
Harbang(int a, int b) : a{ a }, b{ b };
};
class Forest
{
Harbang h1;
Harbang h2;
public:
Forest(int a, int b, int c, int d)
: h1{a, b}, h2{c,d}
{}
};
멤버 초기화 리스트 주의사항
실행 순서는 초기화 코드가 놓인 순서가 아니라
멤버 데이터가 선언된 순서대로 초기화해주어야 한다.
#include <iostream>
class Harbang
{
public:
int a;
int b;
// Harbang() : b{ 5 }, a{ b }
Harbang() : a{ 5 }, b{ a }
{}
};
int main()
{
Harbang h;
printf("%d %d\n", h.a, h.b);
}
생성자 함수에서 나열된 순서와 별개로
멤버 초기화는 변수 선언된 순서대로 수행된다.
그렇기 때문에 a → b 순서로 수행되기 때문에
아래와 같은 이유로 나열 순서를 잘 지켜주어야 한다.
Harbang() : b{ 5 }, a{ b }
• a = b (undefined)
• b = 5
Harbang() : a{ 5 }, b{ a }
• a = 5
• b= a
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 클래스 파일 분할 (4) | 2025.01.30 |
---|---|
[C++] constexpr function (1) | 2025.01.29 |
[C++] lower_bound, upper_bound 사용해보기 (1) | 2025.01.27 |
[C++] rvalue reference (4) | 2025.01.27 |
[C++] constexpr 키워드 (2) | 2025.01.26 |
댓글