반응형
CPP 초급 강좌 30. explicit 생성자
explicit 생성자에 대해 봅시다.
다음 코드를 볼까요.
class MyNumber{
private:
int value;
public:
MyNumber(int value)
{
this->value = value;
}
};
int main()
{
MyNumber n1(1); //a
MyNumber n2 = 2; //b
}
간단하게 숫자 하나를 저장하는 클래스를 만들었고, main에서 객체를 생성합니다.
a n1의 경우는 n1(1); 이란 코드로 직접 초기화를 합니다. direct initialization
b n2는 =을 사용하여 복사 초기화를 합니다. copy initalization
이제는 MyNumber을 인자로 사용하는 함수가 있다면, 다음 코드가 가능할까요?
void f(MyNumber value) {}
int main()
{
MyNumber n1(1); //a
MyNumber n2 = 2; //b
f(n1); //c
f(3); //d
}
c는 잘 동작합니다. 크게 이상이 없습니다. d는? 잘 동작합니다. d와 같은 코드는 어떻게 동작하는 것일까요?
이는 함수 인자를 전달 방식에 관하여 아셔야 합니다. 함수 인자 전달 시 복사 초기화를 사용합니다. 3의 입력의 b와 같은 코드로 동작한다는 것이죠. 클래스 설계자는 함수 인자로 전달 시 복사 초기화에 관하여 제어할 수 있습니다.
explicit 생성자
class MyNumber{
private:
int value;
public:
explicit MyNumber(int value)
{
this->value = value;
}
};
void f(MyNumber value) {}
int main()
{
MyNumber n1(1); //a
MyNumber n2 = 2; //b
f(n1); //c
f(3); //d
}
MyNumber의 생성자를 explicit MyNumber(int value) 라고 수정하였습니다. explicit를 앞에 붙였습니다. 이럴 경우 복사 초기화는 사용할 수 없게 됩니다.
클래스의 구현 의도에 따라 explicit를 사용하면 됩니다.
봐주셔서 감사합니다.
반응형
'IT > C++(CPP)' 카테고리의 다른 글
CPP 초급 강좌 100. C++ structured binding (0) | 2022.02.11 |
---|---|
VS2019 헤더 소스 전환 단축키 + 유용한 단축키 모음, Visual Assit 없이 하는 방법 (0) | 2021.08.21 |
CPP 초급 강좌 29. 맴버 초기화 리스트 member initializer lists (0) | 2020.11.10 |
CPP 초급 강좌 28. 생성자 constructor (1) | 2020.11.09 |
CPP 초급 강좌 27. 접근지정자, 캡슐화, friend 함수 (4) | 2020.11.06 |
댓글