본문 바로가기

C++/C++ 문법

[C++] 멤버 이니셜라이저 (Member Initializer), const 멤버변수 초기화

728x90
반응형

멤버 이니셜라이저

 

멤버 이니셜라이저를 사용하면 객체가 아닌 멤버의 초기화가 가능하다.

 

class TestClass {
private:
	int num1;
	int num2;
public:
	TestClass(int n1, int n2)
		: num1(n1), num2(n2)
	{
		cout << "Member Initializer" << endl;
		cout << "num1 : " << num1 << endl;
		cout << "num2 : " << num2 << endl;
	}
};

 

위 코드에서 : num(n) 이 멤버 이니셜라이저인데 생성자의 인자로 n1, n2 를 전달받으면

num1, num2 의 선언과 동시에 대입하겠다는 의미이다.

 

즉, 초기화를 하겠다는 의미이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

멤버 이니셜라이저의 활용

 

멤버 이니셜라이저를 사용할 때 선언한 후 대입하는 것이 아니라

초기화를 진행하게 되기 때문에 const 멤버변수의 초기화도 가능하다.

 

class TestClass {
private:
	const int num;
public:
	TestClass(const int n)
		: num(n)
	{
		cout << "Member Initializer" << endl;
		cout << "num : " << num << endl;
	}
};

 

따라서 다음과 같은 코드도 가능하다.

 

 

 

상수뿐만 아니라 참조자도 선언과 동시에 초기화가 이루어져야만 한다는 특성이 있다.

 

멤버 이니셜라이저를 사용하면 참조자도 멤버변수로 사용이 가능하다.

 

class TestClass {
private:
	int& num;
public:
	TestClass(int& n)
		: num(n)
	{
		cout << "Member Initializer" << endl;
		cout << "num : " << num << endl;
	}
};

 

 

위와 같이 선언하게 되면 생성자로 받은 변수를 num 이라는 새로운 이름으로 선언한 것과 같은 의미이기 때문에

외부 변수를 객체 내부에서 수정하는 것도 가능하다.

 

 

 

 

#include <iostream>
using namespace std;

class TestClass {
private:
	int& num;
public:
	TestClass(int& n)
		: num(n)
	{
		cout << "Member Initializer" << endl;
		cout << "num : " << num << endl;
		num++;
	}
};

int main()
{
	int n1 = 10;
	TestClass test(n1);
	cout << n1;

}

 

 

 

 

생성자에서 실행된 num++n1 에도 적용된 것을 확인할 수 있다.

 

 

*상수는 C++11부터 클래스 내부에서 선언과 동시에 초기화가 가능하지만 참조자는 반드시 이니셜라이저를 사용해야 한다.

 

728x90
반응형