본문 바로가기

C11

[ 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.
[ 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++ ] 가상함수 테이블( V-Table ) 먼저 예제를 보고 가상 함수 테이블( V-Table )에 대해 알아보자. Func1은 가상 함수이고 Func2는 클래스 A의 멤버 함수, Func3는 클래스 B의 멤버 함수이다. 먼저 클래스 A를 보면 virtual로 선언된 가상 함수가 존재한다. 이렇게 한 개 이상의 가상 함수를 포함하는 클래스에 대해서는 컴파일러가 다음과 같은 형태의 '가상함수 테이블'을 만든다. 가상함수 테이블을 보면, key와 value가 있다. key에는 호출하고자 하는 함수를 구분 지어주는 식별자이고, value는 구분자에 해당하는 함수의 주소이다. 만약 A 객체를 생성하면 객체에 A 클래스의 가상 함수 테이블의 주소 값이 저장된다. 그럼 A 객체의 Func1 함수 호출 시 다음과 같은 참조 과정을 가진다. A 객체의 Func.. 2019. 10. 10.