취미로 음악을 하는 개발자

[C++] 초기화 목록, 생성자 위임 본문

공대인/C[++]

[C++] 초기화 목록, 생성자 위임

영월특별시 2019. 5. 5. 19:04
728x90


- 초기화 목록 안했을 때

Complex() {
real = 0;
imag = 0;
}
Complex(double real_, double imag_) {
real = real_;
imag = imag_;
}


- 초기화 목록

Complex() : real(0), imag(0) {}
Complex(double real_, double imag_) : real(real_), imag(imag_){}


보이는 것과 같이 일단 위의 코드를 단 두 줄로 표현할 수 있고 그만큼 효율성도 좋다.

간단하게 둘의 차이를 말해보자면

Complex c;                                Complex c = Complex(1,2);

c = Complex(1, 2);


위의 차이와 같다.

즉, 명령어를 2번 실행하는 것과 1번 실행하는 것의 차이이며,

첫 번째는 메모리에 Complex가 만들어지고 그 값이 1, 2로 대입되는 것이고

두 번째는 메모리에 Complex가 만들어지면서 값이 1, 2로 대입되는 것이다.



우리가 시간을 표현할 때 보통 시, 분, 초로 표현한다.

하지만 초만 표현할 때는 12초, 5초 등으로 말하지 0분 12초라고 하지 않는다.

5분을 말할 때도 0시간 5분이라 하지 않는다.


그럼 이런식으로 표현하려면 어떻게 해야 할까? -> 생성자 위임

기본적인 구조는 초기화 목록과 비슷하지만 초기화 목록과 다른 것은 : 뒤에 오는 것이 함수 형태로 오는 것이다.


생성자 위임을 안쓰고 표현한다면 아래와 같이 디폴트 값으로도 줄 수는 있다.

Time(int h_, int m_ = 0, int s_ = 0) {

h = h_;

}


하지만 단순히 ?분 ?초로 표현 하고싶다고 하면 오버로딩을 많이 하게 될 것이다.

Time() : h(0), m(0), s(0) {}
Time(int s_) : Time() {
s = s_;
}
Time(int m_, int s_) : Time(s_) {
m = m_;
}
Time(int h_, int m_, int s_) : Time(m_, s_){
h = h_;
}

여기서 (1, 2, 3)으로 초기화한다면 매개변수가 3개인 생성자가 실행될 것이다.

하지만 이 때 먼저 실행되는 것은 : 뒤에 있는 함수이다. 그래서 매개변수가 2개인 생성자로 다시 가게 되고

이 과정이 반복되서 Time()에 도달할 것이다.

순서 :

h    m    s

0    0    0

0    0    3

0    2    3

1    2    3


위와 같은 순서로 하나씩 대입하게 되고 마지막에 h = 1, m = 2, s = 3이 되는 것이다.



'공대인 > C[++]' 카테고리의 다른 글

[C++] 인라인(inline) 함수  (0) 2019.05.12
[C++] Static 멤버  (0) 2019.05.12
[C++] 객체 생성과 소멸  (0) 2019.05.05
[C++] 클래스  (0) 2019.04.23
[C++] Namespace  (0) 2019.04.12
Comments