PL(150)
-
컴파일 에러와 런타임 에러
[참고] https://spaghetti-code.tistory.com/35 #include int main(void) { void* ptr = NULL; int a = 3; ptr = &a; printf("%d\n", *ptr); } 위 에러는 '식이 완전한 개체 형식의 포인터여야 합니다'라고 컴파일 오류를 낸다. '타입체크 에러'로 분류되는 것 같다 [수정 후] #include int main(void) { void* ptr = NULL; int a = 3; ptr = &a; printf("%d\n", *(int*)ptr); } 할당되지 않는 영역에 대해서 읽기를 시도할 때는 런타임 에러를 발생시킨다 #include int main(void) { printf("%d\n", *(int*)(0x0A0A)..
2019.11.18 -
for문 증감부분에서의 ++i와 i++의 차이
i++, ++i 증감연산자를 하면 실제로 연산자 오버로딩으로 들어가게 된다 전위 증가연산자는 자신의 객체가 그대로 반환되도 되기 때문에 빠르지만, 후위 증가연산자는 다음 행에서 변화가 생겨야하므로 객체를 복사하는 부분이 따로 이뤄지기 때문에 전위연산자를 다시 한 번 호출하기 때문에 조금 느리다. 하지만 큰 차이는 없는 것 같다
2019.11.17 -
friend 함수, 클래스 올바르게 사용하기
클래스 간 상호작용을 위해서 friend 키워드가 가끔 사용된다. 캡슐화에 위배되는 사항이라 사용은 지양되지만 실제로 연산자 오버로딩 등 절대적으로 필요한 부분이 있다 다음 코드는 클래스 A에 private 멤버에 접근하려고하니 오류가 발생한 것이다 #include using namespace std; class A { private: int m_value = 1; }; void printA(A &a) { cout
2019.11.17 -
new 연산자를 이용한 2차원 배열 할당
malloc과 비슷하게 먼저 각 행에 대한 base 주소를 할당하고 주소 하나당 열에 맞춰서 크기를 할당해서 2차원 배열을 만들 수 있다. new의 장점은 할당을 하면서 초깃값을 정할 수 있다는 점이다 #include using namespace std; int main(void) { int **ptr = new int*[3]; for (int i = 0; i < 3; i++) { ptr[i] = new int[5]{ 1, 2, 3, 4, 5 }; } for (int i = 0; i < 3; i++) { for (int j = 0; j < 5; j++) { cout
2019.11.16 -
가상 소멸자가 필요한 이유
다형성에서 주로 거론이 된다. 주로 자식 클래스인 derived는 누구에게서 만들어졌는지 종종 모를 때가 많다. 따라서 base 클래스의 포인터를 선언해서 자식 클래스를 지정해서 삭제하는 경우가 대부분이다 #include using namespace std; class Base { public: ~Base() { cout
2019.11.16 -
큐 연결리스트로 구현하기
포인터를 이용해 동적할당을 완전히 이해한 예제 영역을 할당받을 때는 매개변수로 전달할 때는 포인터 변수도 복사가 되기 때문에 포인터 변수의 주소를 넘기거나 할당된 영역을 반환받는 함수로 짜야한다 [참고] https://www.geeksforgeeks.org/queue-linked-list-implementation/
2019.11.15