암시적 데이터형 변환
//Test.h
class Test{
Test();
Test(double d);
};
//Test.cpp
Test::Test()
{
}
Test::Test(double d)
{
}
//Main.cpp
int main()
{
Test save2;
save2 = 19.6;
}
- Test(double d)는 double을 Test 객체로 변환하는 것이다.
- 위의 메인에서 Test 객체를 생성하고 Test(double)을 사용하여 19.6을 Test로 변환한다.
- 메인의 두번째 줄에서 Test(double)을 사용하여 Test 임시 객체를 생성한다. 이 때 19.6을 초기화 값으로 사용한다.
그리고나서 멤버별 대입으로 임시 객체의 내용을 save2에 복사하게된다. 이 과정을 명시적으로 데이터형 변환이 없기에 암시적 데이터형 변환이라고 한다.
Test(int h); //허용
Test(int h, int m = 0); //허용
Test(int h, int m); //허용하지 않음
- 하나의 매개변수를 가진 것만이 이와 같은 변환 함수로 동작한다.
- 단, 디폴트값을 제공하여 입력받는 매개변수가 하나만 넣어도 동작할 경우에는 가능하다.
명시적 데이터형 변환
//Test.h
class Test{
explicit Test(double d);
};
//Test.cpp
Test::Test(double d)
{
}
//Main.cpp
int main()
{
Test save2 = 19.6; //X
Test save2 = Test(19.6); //O
}
- 생성자에 explicit을 사용하면 객체를 생성할 때에 암시적 데이터형 변환을 허용하지 않는다.
- 메인의 첫줄에 있는 코드중 19.6를 대입하는 것은 암시적으로 19.6인 double을 Test형으로 데이터를 변환한다.
- 둘째줄에 있는 Test(19.6)은 명시적으로 사용하기 때문에 암시적으로 데이터형을 변환하는 것을 막는 explicit를 피해간다.
클래스의 변환 함수
//클래스내 함수 원형
operator int() const;
//클래스의 cpp 함수
Test::operator int() const
{
return hours;
}
//Main.cpp
Test save(3, 20);
int x = save;
- 변환 함수는 클래스의 메서드여야 한다.
- 변환 함수는 리턴형을 가지면 안 된다.
- 변환 함수는 매개변수를 가지면 안 된다.
- 해당 객체를 int형의 변수에 넣을 때 자동으로 int형 값을 리턴하는 operator int()함수를 불러와 형변환한다.
- 명시적으로 사용할 수 있다. 함수원형에 explicit를 사용하면 명시적으로 int형을 사용할 수 있다. int(save)
explicitexplicit
'C++ > Basic' 카테고리의 다른 글
[C++] 대입 생성자 (0) | 2021.06.30 |
---|---|
[C++] 복사 생성자 (0) | 2021.06.29 |
[C++] 연산자 오버로딩과 프렌드 (0) | 2021.06.24 |
[C++] 열거체 (0) | 2021.06.21 |
[C++] 클래스의 초기화, const 멤버 함수 (0) | 2021.06.20 |