참고 : https://cosyp.tistory.com/228 v-table: 함수 포인터가 들어있는 테이블함수 포인터: 함수의 주소를 저장하는 포인터-> 콜백 함수를 위해 많이 쓰인다. v-table은 virtual function이라는 기능을 위해 쓰이고,v-table안에는 함수 포인터들이 배열의 형태로 저장되어있다. Override결과를 보면 상속받은 부모 객체의 함수가 실행되는 것이 아닌 자식 클래스의 객체가 실행되고 있다. 이렇게 상속받은 함수의 자식 클래스에서 재정의하는 것을 Override라고 한다. virtual function또한, Parent 타입의 p 포인터 변수에 Child 객체의 주소를 넣고 실행을 시켜도 Parent 타입의 함수가 호출이 된다. 이는 단순히 함수를 오버라이딩하더라..
1. 연산자 오버로딩위와 같은 연산을 오버로딩을 통해 내가 임의로 진행할 수 있다. 예제로 살펴보자.만약 단순히 3 + 5를 진행한다면 8이라는 값을 얻을 수 있으나,(3 + 5i) + (6 + 8i)와 같이 복소수의 연산을 진행하려면 내가 생각한대로 프로그램이 돌아가지 않을 것이다.그렇기에 연산자 오버로딩을 통해 위와 같은 계산을 진행하고자 한다.123456789101112131415161718192021222324252627282930313233343536373839404142434445#include iostream>using namespace std;class Complex {private: friend Complex operator+(const Complex&, const Complex&)..
기존 문제는 사과의 구매 목적으로 0보다 작은 수를 전달할 수 없고, 함수를 const로 선언하여 코드의 안정성을 높이는 것이었다. 기존대로 구현 후 문득 떠오른 생각은 만약 구매자의 돈이 엄청나게 많다면? 그래도 사과의 개수는 정해져 있으므로 판매자는 구매자의 돈 전부를 수익으로 낼 수 없다. 즉, 아무리 돈이 많아도 판매자가 얻을 수 있는 수익과 구매자가 지불할 금액은 정해져 있다. 이것까지 한 번 구현해보았다. 근데 이상하게 구현했을수도..? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5..
포인터 배열은 말 그대로 포인터로 이루어진 배열이다. 앞서 포스팅한 배열 포인터와는 이름부터가 다르다. int a[3][5]; int b[6]; int* p = b; b[0]의 주소값을 100이라고 한다면, b = 100, b + 1 = 104이다. 마찬가지로, p = 100, p + 1 = 104이다. 이는 앞서 포스팅한 내용과 같다. 왜? 배열로 이루어진 포인터니까. 여기서 볼 것은 a와 같이 선언된 배열이다. p = a라는 선언이 될까? 된다면 좋겠지만 선언은 int (*p)[5] = a; 라고 선언해야한다. 그 이유는 아래와 같다. a의 주소값을 200이라고 한다면, a = 200, a + 1 = 220, a + 2 = 240이 된다. 200 204 208 212 216 220 224 228 23..
일단 알아야 할 첫 번째 잡기술 포인터는 자료형에 상관 없이 4byte를 차지한다. 별로 중요해보이지 않다고 느낄수도 있으나 은근 중요한 내용이다. int a[5] = { 2, 4, 6, 8, 10 }; int* p = a; sizeof(int) = 4; sizeof(a) = 20; sizeof(a[0]) = 4; 이런 식으로 공간을 차지하고 있다. 만약 a = 50을 선언하면? --> 에러가 난다. 그 이유는 배열명은 변수가 아니라 시작 주소를 가지는 상수이기 때문이다. 여기서 중요한 점은 배열명은 시작 주소를 가지는 상수라는 부분이다. a[0]의 주소값을 100번지라고 한다면, a = 100 번지 a + 1 = 104번지 이런식으로 읽을 수 있다. 마찬가지로 포인터식으로 표현하자면, a = 100번지..