• 하나의 매개변수를 취하는 생성자

오 이건 처음 알게 된 내용이다.

 

하나의 매개변수를 취하는 생성자는 사용자 데이터형으로 캐스팅될 때도 사용이 된다.

처음보면 A = 44가 말도 안되었지만 가능이였다ㅋㅋ
실행결과

 

A = 44; 구문에서

c++컴파일러는 먼저 type casting이 가능한지 확인한다.
찾을 때 매개변수가 하나인 생성자도 같이 찾아보기 때문에 이에 맞는 생성자가 있다면 호출되는 것.
A = MyClass(44)로 변환된다는 말.
고로 생성자에 44를 넣은 MyClass클래스의 임시 객체를 생성하여 대입한다.

 

이렇게 컴파일러에서 매개변수가 한 개인 생성자가 사용되는 때는 여러 가지가 있는데

방금 위의 코드로 예시를 들자면

 

1. 객체에 매개변수형 값으로 초기화할 때

2. 객체에 매개변수형 값을 대입할 때

3. 객체 타입의 자료형인 매개변수를 기대하는 함수에 생성자 매개변수 자료형으로 매개변수를 전달할 때

4. 객체타입의 값을 리턴하도록 선언된 함수가 생성자 매개변수의 자료형 값으로 리턴하려 할 때

5. 1~4 상황에서 생성자 매개변수의 자료형으로 변환할 수 있는 내장 데이터형을 사용할 때

말 그대로

생성자 매개변수의 자료형(여기서는 int)로 변환할 수 있는 내장 데이터형(flaot, double...)을 사용한 것뿐

진행순서는 들어온 실수 자료형을 int형으로 변환 후 다시 int형을 MyClass형으로 변경한다.

 

근데 이처럼 자동으로 형 변환을 해주는 기능을 막는 기능 또한 있다.

바로 explicit이다.

 


  • explicit

explicit 키워드를 사용하면 명시적으로만 사용 가능하다

즉 암시적 데이터형 변환을 못하게 막는다.

5가지 상황 중 가능했던 상황도 막을 수 있다.


  • 변환 함수 (conversion function)

위에서 어떠한 수를 객체로 타입 캐스팅했었는데

그 반대로도 가능하다.

 

위처럼 생성자가 아닌 변환 함수를 이용하는 것인데, 사용자 정의 강제 데이터형 변환이다.

어떠한 typeName으로 변환하려면 다음과 같은 형식으로 사용한다.

 

operator typeName( );

 

이처럼 변환 함수는 리턴타입, 매개변수를 가질 수 없게 만들어져 있다.

 

예시 코드이다.

실행결과

다만 이처럼 여러 개의 변환 함수가 있을 때

모호하지 말고 명확하게 타입을 써주자

 

근데 변환 함수가 한 개라면 어떤 걸로 변환될지 정해져 있기에 명확하지 않은 암시적으로도 가능하다.

근데 또 사람이 실수할 수도 있기 때문에 C++11에서 explicit과 함께 사용이 가능토록 변경되었다.

 


  • 변환과 프렌드

변환함수와 프렌드를 같이 사용할 경우 이러한 혼동이 올 수 있다.

+ Recent posts