C++에서는 객체 간의 대입 연산을 허용한다.
( 객체의 자료형이 일치할 때만 대입 연산이 가능하다. )
그럼, 객체와 정수간의 대입 연산도 가능할까?
가능하다.
그럼, 어떤 과정을 통해서 위의 결과가 나오는지 자세히 살펴보겠다.
자세히 보면 Num 생성자가 두번 일어난 것을 확인할 수 있다.
먼저 객체 n이 생성할 때 한번,
Num n;
그리고 n = 20을 연산할 때 한번 일어난다.
n = 20;
즉, 연산을 위해서 임시 객체가 생성된 것을 확인할 수 있는데, 좀 더 풀어보면
n = 20;
n = Num(20); // 임시객체 생성
n.operator=(Num(20)); // 임시객체를 대상으로 하는 대입 연산자 호출
이런 과정을 가진 것을 확인할 수 있다.
그리고 이러한 임시 객체의 생성을 통해서 대입 연산이 진행되는 데에는 다음과 같은 문법적 기준이 존재한다.
" Num형 객체가 와야 할 위치에 다른 형식의 데이터 또는 객체가 왔을 경우, 다른 형식의 데이터를 인자로 받는 Num형 클래스의 생성자 호출을 통해서 Num형 임시 객체를 생성한다."
즉, Num형 객체가 와야 할 위치에 int형 데이터가 와서 int형 데이터를 인자로 전달받는 Num 클래스의 생성자 호출을 통해서 Num형 임시객체를 생성한 것이다. 그리고 두 Num 객체로 대입 연산을 진행했다.
반대로 객체를 기본 자료형 데이터로 형 변환도 가능하다!
여기서
Num n2 = n1 + 30;
n1이 int 형으로 형 변환이 된 상황이다.
객체가 형 변환을 위해서는 형 변환 연산자가 필요한데
operator int ()
{
return n;
}
이것이 형 변환 연산자이다.
형 변환 연산자는 반환형을 명시하지 않는다.
여기서 operator int는 int형으로 형 변환해야 하는 상황에서 호출되는 함수라고 생각하면 된다.
그래서 n2에는 20과 30의 덧셈 연산의 결괏값이 생성자에 대입된다.
'스터디 > C++' 카테고리의 다른 글
[ C++ ] 함수 템플릿(Function Template)과 템플릿 함수(Template Function) (1) | 2019.11.29 |
---|---|
[ C++ ] String 클래스 (0) | 2019.11.28 |
[ C++ ] << 와 >> 연산자 오버로딩 예제 (0) | 2019.11.28 |
[ C++ ] 펑터(Functor), 함수 오브젝트(Function object) (0) | 2019.11.28 |
[ C++ ] 스마트 포인터 ( Smart Pointer ) (0) | 2019.11.28 |