IT 프로그래밍/객체지향프로그래밍

[따배시 8.4] 생성자 멤버 초기화 목록

기술1 2024. 5. 15. 15:16
반응형
public:
	Something()
	{
		m_i = 1;
		m_d = 3.14;
		m_c = 'a';
	}

이런 식으로 생성자를 만들어줄 수도 있지만 더 간편한 방법이 존재합니다. initialize list라고 말합니다. 

public:
	Something()
		: m_i(1), m_d(3.14), m_c('a')
	{}

이런식으로 써도 똑같은 방식이며 실전에서는 이러한 방식을 주로 사용할 것입니다.

 

 

전체 코드

#include <iostream>
using namespace std;

class Something
{
private:
	int m_i;
	double m_d;
	char m_c;

public:
	Something()
		: m_i(1), m_d(3.14), m_c('a')
	{}

	void print()
	{
		cout << m_i << " " << m_d << " " << m_c << endl;
	}
};

int main()
{
	Something som;
	som.print();

	return 0;
}

이런 식으로 써줄 수 있는 것입니다. 이렇게 되면 something 생성자에서 정의했던 것대로 출력되는 것을 볼 수 있습니다. 

 

생성자를 사용해주는 이유는 어떤 변수를 만들면서 그 변수의 값을 지정해주고 싶을 때 사용하는 것입니다. 

 

이렇게 할 경우 변경을 할 때 편하게 변경할 수 있다는 장점이 있습니다. 

 

private:
	int m_i = 100;
	double m_d = 100.0;
	char m_c = 'F';
	int m_arr[5] = { 100, 200, 300, 400, 500 };
	B m_b{ 1024 };
public:
	Something()
		: m_i{ 1 }, m_d{ 3.14 }, m_c{ 'a' }, m_arr{ 1, 2, 3, 4, 5 }, m_b{ m_i - 1 }
	{}

이렇게 하면 어떻게 될까요?

 

둘 다 초기화를 해주고 있는 상태에서 초기화를 해준다면 생성자가 우선으로 생성이 됩니다. 생성자가 우선순위가 높다라는 것을 기억해주시면 됩니다.

 

 

위임생성자

public:
	Student(const string& name_in)
		: m_id(0), m_name(name_in)
	{}

	Student(const int& id_in, const string& name_in)
		: m_id(id_in), m_name(name_in)
	{}

위와같이 생성자가 생성자를 가져다 쓰는 것을 위임생성자라고 합니다. 

public:
	Student(const string& name_in)
		//: m_id(0), m_name(name_in)
	{
		init(0, name_in);
	}

	Student(const int& id_in, const string& name_in)
		//: m_id(id_in), m_name(name_in)
	{
		init(id_in, name_in);
	}

	void init(const int& id_in, const string& name_in)
	{
		m_id = id_in;
		m_name = name_in;
	}

이런식으로 분리하는 방법도 사용하기도 합니다. void init을 통해 만능적인 생성자를 만들어준 다음에 위에 student 각각에 넣어주는 방식으로 사용하는 것입니다. 

 

초기화 함수를 별도로 만드는 이 방법은 코딩 스타일에 따라 다르겠지만 꽤 빈도있게 사용하는 방식이므로 기억을 해두시는 것을 추천드립니다.

 

 

반응형