본문 바로가기
개발 언어/cpp

cpp 멤버 이니셜라이저(Member Initializer)

by eeeun:) 2022. 1. 3.
반응형

cpp에서는 멤버 이니셜라이저를 지원!

 

멤버 이니셜라이저가 뭘까?

멤버(member) = 클래스 내의 멤버 변수

이니셜라이저(initializer) =  초기화

멤버 이니셜라이저 = 클래스가 생성되면서 바로 멤버 변수를 초기화해주는 것

 

멤버 이니셜라이저가 왜 생겼을까!?

멤버 이니셜라이저가 있기 전에는 밑에 코드와 같이 생성자 안에서 변수를 초기화해줘야 했다

class A {
private:
	int a;

public:
	A(int _a) {
    	a = _a;
    }
}

이렇게 생성자를 통해서 멤버 변수를 초기화하는 것은 불편하기에 멤버 이니셜라이저(Member Initializer) 필요!

멤버 이니셜라이저의 장점

1. 초기화의 대상을 명확히 인식이 가능

2. 선언과 동시에 초기화가 이뤄지는 바이너리 코드가 생성되기에 성능에도 이점을 가짐

 

멤버 이니셜라이저 사용 방법

class A {
private:
	int a;
public:
	A(int _a):a(_a) {
    }
}

 

생성자 뒤에 :변수이름(값) 을 적어주면 멤버 이니셜라이저 성공!

 

멤버 이니셜라이저 안 되는 예

ex 1)

// 부모 클래스
class A {
protected:
	int a;
public:
	A (int _a) : a(_a) {
    }
}

// 자식 클래스
class B : A {
public:
	B (int _a) : a(_a) {
    }
}

위의 코드는 오류가 나는 코드이다

자식 클래스에서 a는 부모클래스가 생성한 a를 공유하는 것 -> 이니셜라이저는 클래스가 생성될 때 실행

그러므로 이미 부모 클래스가 생성될 때 a의 초기화를 해줬기 때문에, 자식 클래스에서는 a의 이니셜라이저를 정의할 수 없다

 

 

ex 2)

class A {
private:
	int a;
	int b;
    int c;

// 오류가 남!!
public:
	A (int _a) : b(1), c(1), a(_a) {
    }
// 정답 코드!!
	A (int _a) : a(_a), b(1), c(1) {
    }
}

A 생성자의 메개변수로 이니셜라이저를 할 때는 매개변수를 사용하는 변수를 제일 앞쪽에 둬야 된다

A (int _a) : b(1), c(1), a(_a)       👈 이런 식으로 매개변수를 뒤쪽에 두면 오류가 난다!

728x90

댓글