본문 바로가기

연산자8

[ C++ ] C++ 형 변환 연산자 총 정리( static_cast, const_cast, dynamic_cast, reinterpret_cast ) C 스타일의 형 변환 연산자는 무적의 형 변환 연산자(Old C-style cast operator)이기에.. C 언어와의 호환성을 위해서 존재하지만, C++에서의 새로운 형 변환 연산자를 사용하는 것이 안전하다. C++에서 발생할 수 있는 C의 형 변환의 문제점은 기초 클래스의 포인터 형을 유도 클래스의 포인터 형으로 변환하는 것이 있기에, 일반적인 연산이 아니다. 그래서 C++은 다음과 같이 총 4개의 연산자를 추가로 제공하면서 용도에 맞는 형 변환 연산자의 사용을 권하고 있다. dynamic_cast dynamic_cast(expr) 사이에 변환하고자 하는 자료형의 이름을 둔다. 하지만 객체의 포인터 또는 참조형이 와야 한다. ( ) 사이에는 변환의 대상이 와야 한다. dynamic_cast는 다음.. 2019. 12. 7.
[ C++ ] 임시객체로의 자동 형 변환과 형 변환 연산자(Conversion Operator) C++에서는 객체 간의 대입 연산을 허용한다. ( 객체의 자료형이 일치할 때만 대입 연산이 가능하다. ) 그럼, 객체와 정수간의 대입 연산도 가능할까? 가능하다. 그럼, 어떤 과정을 통해서 위의 결과가 나오는지 자세히 살펴보겠다. 자세히 보면 Num 생성자가 두번 일어난 것을 확인할 수 있다. 먼저 객체 n이 생성할 때 한번, Num n; 그리고 n = 20을 연산할 때 한번 일어난다. n = 20; 즉, 연산을 위해서 임시 객체가 생성된 것을 확인할 수 있는데, 좀 더 풀어보면 n = 20; n = Num(20); // 임시객체 생성 n.operator=(Num(20)); // 임시객체를 대상으로 하는 대입 연산자 호출 이런 과정을 가진 것을 확인할 수 있다. 그리고 이러한 임시 객체의 생성을 통해서 .. 2019. 11. 28.
[ C++ ] 배열 클래스와 인덱스 연산자 오버로딩 배열 접근 연산자(인덱스 연산자)인 [ ]을 오버 로딩할 것인데, 이건 멤버 함수 기반으로만 오버 로딩이 가능한 연산자이다. 이것 외에도 = 대입 연산자 ( ) 함수 호출 연산자 -> 포인터 연산자 총 4개는 멤버함수 기반으로만 오버 로딩이 가능한 연산자이다. 그럼 배열 클래스를 생성하고, 인덱스 연산자를 오버 로딩을 해보자. Int형 데이터를 저장하는 배열 클래스를 선언해 보았다. arr 크기를 5로 잡고 0번에는 1 1번에는 2 2번에는 3 3번에는 4 4번에는 5 값을 저장하였다. 근데 여기서 0~4번이 아닌 다른 인덱스를 접근하면 어떻게 될까? arr [5]에 접근하니까 이상한 데이터를 받아온다. 이렇듯 C와 C++은 기본적으로 배열에서 경계 검사를 하지 않는다. 그래서 벗어난 범위의 데이터를 가.. 2019. 10. 11.
[ C++ ] 대입 연산자 오버로딩 대입 연산자 오버 로딩을 하지 않으면 기본적으로 디폴트 대입 연산자가 생긴다. 그전에 대입 연산자의 오버 로딩이랑 복사 생성자와 비슷하기 때문에 복사 생성자 특징을 다시 살펴보면 - 정의하지 않으면 디폴트 복사 생성자가 생긴다. - 디폴트 복사 생성자는 얕은 복사를 한다. - 생성자 내에서 동적 할당을 하거나 깊은 복사가 필요하면 직접 정의를 해야 한다. 그리고 대입 연산자의 오버로딩 특징은 - 정의하지 않으면 디폴트 대입 연산자가 생긴다. - 디폴트 대입 연산자는 얕은 복사를 한다. - 연산자 내에서 동적 할당을 하거나 깊은 복사가 필요하면 직접 정의를 해야 한다. 둘은 유사하지만 호출되는 시점이 다르다. 복사 생성자의 경우에는 이렇게 호출하지만 대입 연산자 오버 로딩은 이렇게 호출한다. 즉, 복사 생.. 2019. 10. 11.