본문 바로가기

C++74

[ C++ ] 연산자 오버로딩 C++은 함수 오버 로딩뿐만 아니라 연산자도 오버 로딩이 가능하다. 연산자 오버로딩이 무엇일까? 말 그래도 연산자를 오버 로딩하는 것이다. 객체가 기본 자료형 변수처럼 덧셈, 뺄셈, 혹은 곱셈과 같은 연산들을 가능하게 하는 것이다. 즉, 객체도 기본 자료형 데이터처럼 취급한다고 생각하면 된다. 어떻게 하면 가능할까? 먼저 예제를 보자. 여기서 Dot은 x와 y좌표가 있는 점에 대한 클래스이다. dot1 객체는 x좌표가 1, y 좌표가 2이고 dot2 객체는 x좌표가 3, y 좌표가 4이다. 그리고 dot3은 dot1 객체와 dot2 객체를 + 연산자로 더한 객체이다. 실행 결과에서 dot3가 dot1과 dot2의 x좌표를 더한 값과 dot1과 dot2의 y좌표를 더한 값으로 멤버를 구성한 것을 확인할 수.. 2019. 10. 10.
[ C++ ] 다중상속( Multiple Inheritance )과 가상상속( Virtual Inheritance ) C++은 클래스 다중 상속을 지원하는 객체지향 언어인데, 둘 이상의 클래스를 동시에 상속하는 것을 다중 상속( Multiple Inheritance )이라고 한다. 다중 상속의 예제를 보자. 여기서 보면 문제점이 없어 보인다. 근데 만약에 클래스 A와 B에 동일한 이름의 멤버가 존재하면 어떻게 될까? 그럼 컴파일러가 어느 클래스의 멤버에 접근할지 몰라서 모호하다면서 화를 낸다..;; 그래서 호출하는 멤버 함수 앞에 기초 클래스 이름을 적어주면 해결된다. 이뿐만 아니라 더 큰 문제점이 있다. 아래의 예제를 보자. 위에서 보이듯이 D 클래스가 A 클래스를 두 번 상속을 받게 된다. 이러한 상황에서 A 클래스를 딱 한 번만 상속하게 하는 방법이 가상 상속( Virtual Inheritance )이다. B 클래.. 2019. 10. 10.
[ C++ ] 가상함수 테이블( V-Table ) 먼저 예제를 보고 가상 함수 테이블( V-Table )에 대해 알아보자. Func1은 가상 함수이고 Func2는 클래스 A의 멤버 함수, Func3는 클래스 B의 멤버 함수이다. 먼저 클래스 A를 보면 virtual로 선언된 가상 함수가 존재한다. 이렇게 한 개 이상의 가상 함수를 포함하는 클래스에 대해서는 컴파일러가 다음과 같은 형태의 '가상함수 테이블'을 만든다. 가상함수 테이블을 보면, key와 value가 있다. key에는 호출하고자 하는 함수를 구분 지어주는 식별자이고, value는 구분자에 해당하는 함수의 주소이다. 만약 A 객체를 생성하면 객체에 A 클래스의 가상 함수 테이블의 주소 값이 저장된다. 그럼 A 객체의 Func1 함수 호출 시 다음과 같은 참조 과정을 가진다. A 객체의 Func.. 2019. 10. 10.
[ C++ ] 가상 소멸자( Virtual Destructor ) 말 그대로 virtual로 선언된 소멸자를 가상 소멸자( Virtual Destructor )라고 한다. 근데 왜 소멸자에 virtual 선언이 필요할까? 먼저 예제를 보자. ( * 혹시 VS에서 위 코드를 작성하다가 다음과 같은 에러가 발생한 경우, "const char * 형식의 인수가 char * 형식의 매개 변수와 호환되지 않습니다" 프로젝트( 오른쪽 클릭 ) > 속성 > C/C++ > 언어 > 준수 모드 > 아니오로 바꿔주면 해결된다. VS 2015에는 가능한데 VS 2017부터 준수 모드가 생겨서 생긴 문제이다. ) 결과에서 보이듯이 객체의 소멸을 A형 포인터로 명령하니, A 클래스의 소멸자만 호출되었다. 따라서 strB가 남아있어, 메모리 누수가 발생하게 된다. 즉, 객체의 소멸과정에서는 포.. 2019. 10. 10.