[C++/C#] 생성자 호출 및 형변환 제어(explicit) 그리고 [RequireComponent(typeof(A))]
class A를 선언한 스크립트,
class B 선언한 스크립트가 있을때
[RequireComponent(typeof(A))]
class B
{
}
이렇게 class B를 선언하기 전에 RequireComponent시키면 class A가 어태치된다
--------------------------------------------------
class Test
{
public int number;
public Test(int n)
{
number = n;
}
}
위와 같은 클래스가 있을 때,
void main()
{
Test t;
Test t1(5);
cout « t.number;
cout « t1.number
t = 10;
coun « t.number;
}
문제1. cout으로 number를 출력하고 있는데 C#과 C++에서는 값이 어떻게 나오는지 써보시오.
C++일 경우 0 5 10 나온다.
C#일 경우 C#일 경우 t = 10에서 에러 호출낸다.
문제2. 그러면 C++에서 t = 10; 구문을 t = 10.0; 으로 바꿀 경우 어떻게 될까?
위와 같이 출력됨.
문제 1과 2의 이유
C#은 암시적형변환을 안해줘서 무조건 형이 다르면 에러를 띄우고, C++ 특성 상 암시적 형변환이 발동돼서 값을 받는게 실수형의 생성자가 없어서 컴파일러가 암시적으로 int형으로 형변환 시켜버려서 호출되는것이다.
----------------------------------------------------------------------------
그럼 내가 생성자에서 int형을 받는데 무조건 int형만 받을려고 할려면 생성자를 어떻게 해야될까??
생성자를 만들때
public explicit Test(int n)
이렇게 explicit 이 키워드를 사용하면 매개변수 타입이 현재 int형인데 float형이 들어오면 오류를 띄우게 하는거
무조건 int형만 받겠다는 의미로 이 키워드를 사용한 메소드는 암시적 형변환을 시도 안하겠다는 의미로 사용하는것이다.
하지만 강제적 형변환으로 해서 접근할 수 있다.
explicit Print(int n) { n을 받아서 출력 }
Print(10) 이렇게 하면 10을 호출하겠지만, 만약에 Print(10.5) 라고 써야될 경우
Print((int)10.5)
강제적 형변환을 해서 넘겨주면 된다.
'프로그래밍 > 공통' 카테고리의 다른 글
구글 플레이 스토어 오류? 업데이트 버튼이 안 뜰 경우. (0) | 2021.11.11 |
---|---|
[공통] virtual과 abstract의 차이 (0) | 2015.12.21 |
오버라이딩 / 오버로딩 (0) | 2015.02.02 |