본문 바로가기
프로그래밍 언어/C++

[C++] member initializer list

by 까망 하르방 2025. 1. 29.
반응형

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

댓글