분류 전체보기 118

C+ 11 스마트 포인터(unique_ptr, shared_ptr, weak_ptr)

C++는 JAVA와 달리 가비지 컬렉터가 없기 때문에 new로 메모리 할당을 하고 사용이 끝나면 사용자가 반드시 delete로 해제해줘야 한다. 하지만 스마트 포인터는 포인터처럼 동작하는 클래스 템플릿으로써, 할당 후 메모리 해제를 해주지 않아도 자동으로 해제해주는 기능을 가진 녀석이다. 더 정확하게 이야기하면 스마트 포인터라는 클래스 템플릿의 소멸자에는 사용한 자원을 해제해주는 코드가 포함되어 있다고 한다. 이러면 자연스럽게 메모리 할당 후 해제를 해주지 않아서 생기는 memory leak도 어느 정도 해결될 것이라고 생각한다. 신기하게 new로 할당한 메모리도 스마트 포인터에 대입하면 나중에 해제해주지 않아도 된다고 한다. 스마트 포인터에는 unique_ptr, shared_ptr, weak_ptr ..

공부/C || C++ 2021.07.07

C++ 오버로딩(overloading) vs 오버라이딩(overriding), 가상함수(virtual function) 그리고 다형성(polymorphism)

C++을 공부한 사람이라면 누구나 한번쯤은 헷갈려 봤을 법한 오버로딩과 오버라이딩에 대해 정리해보자. 우선 오버로딩은 매우 간단하다. 함수 파라미터 타입이나 갯수만 다르게해서 다른 함수로 인식하도록 하는 것이다. 그 말은 함수의 리턴 타입만 다르게 해서는 오버로딩이 아니라는 의미이다. 예를 들어서 이렇게 리턴 타입만 다르고 함수 파라미터의 갯수와 타입이 같으면 오버로딩이 안된다는 것이다. 오버라이딩은 상속 관계에서 부모의 기능을 자식이 상속받을 때, 자식이 부모의 기능을 재정의하는 것을 의미한다. 예를 들어서 class person { public: void foo() { cout

공부/C || C++ 2021.07.05

C 헷갈리는 char*와 char[] 그리고 string <-> char* 변환 방법

C++을 쓰면서는 string만 쓰겠지 생각하지만 은근히 char*나 char 배열을 쓰는 경우가 많다(나만 그런가). 쓰다보면 저 두개의 차이점을 잘 모르겠는데 이번 기회에 공부해서 정리해보려고 한다. 그리고 string char* 변환도 은근 자주 써야하는데 이거도 같이 정리해보자. 먼저 char*와 char array는 사이즈가 다르다 char*는 당연히 포인터니까 4byte이고, char array는 할당한 크기에 따라 달라질 것이다. 또 다른점은 char array는 인덱싱으로 해당 인덱스의 문자만 변경하는게 가능하다. int main() { char str[10] = "Hello"; str[3] = 'r'; } 하지만 char*는 똑같이 선언해도 .rodata section에 들어가는 녀석이라..

공부/C || C++ 2021.07.05

복사생성자란(copy constructor)?

1학년때 C++를 배울때 copy constructor를 처음 접했을땐 어려워서 열심히 공부해서 겨우겨우 이해해서 시험친 기억이 난다. 그때 기억으로는 다 이해했고 안까먹을거라 생각하고 넘어갔지만 막상 몇년이 지나니 까먹은 것 같아서 이 기회에 다시 정리한다. 1. 왜 써야 하는가? 우선 copy constructor라는걸 왜 써야하는지에 대한 의문은 쓰지 않았을 때 생기는 문제에 대해 생각해보면 쉽게 해결된다. 예를 들어 다음와 같은 코드가 있다고 하자 class person { int m_tAge; char* m_pName; public: person() { } person(int _age, char* _name) { m_tAge = _age; m_pName = new char[strlen(_name..

공부/C || C++ 2021.07.05

C++11 가변 인자 함수 템플릿(variadic template)

#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) 사실 가변 인자 함수 템플릿이란 용어는 winapi 강의를 들으면서 처음 접해보는 단어였다. 그때는 이렇게 쓰면 되는구나~ 하고 넘어 갔는데 이번 기회에 좀 더 자세히 정리해보고자 한다. 사실 가변 인자 함수 템플릿 전에 가변 인자 함수라는 것을 알아보자. 가변 인자 함수는 말 그대로 함수의 인자 갯수가 1개부터 여러개가 될 수 있도록 정의 하는 개념을 의미한다. C에서 printf 함수를 예로 많이 든다. printf("%d\n", 3); printf("%d, %d\n", 3, 4); printf("%d, %d, %d\n", 3, 4, 5); printf("%d, %d, ..

공부/C || C++ 2021.07.04

C++ 11 - Rvalue reference

C++ 11에는 내가 몰랐던, 혹은 사용하는지도 몰랐던 여러가지 syntax들과 기능들이 있었다. 이번 기회에 정리해보면 좋을 것 같다. 이번 글에서는 Rvalue reference에 대해서 알아보자 먼저 Rvalue가 뭔지부터 알아보자. 이름만 보면 우측값인데 그런 의미 보다는 C++에서는 임시로 생성됐다가 바로 없어지는 값을 의미한다. Rvalue가 있으면 Lvalue도 있을텐데 Lvalue는 반대로 표현식 이후 scope내에서 다시 사용 가능한 값을 의미한다. 코드로 예를 들어보면 int a = 3 + 4; // 3+4는 rvalue int b = 10; // 10은 rvalue int sum = a+b; // a+b는 rvalue int *p = &a; // &a는 표현식이 종료되면 더 이상 참조..

공부/C || C++ 2021.07.03