목록Tutorials/C++ : Expert (5)
KoreanFoodie's Study
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 생성자를 private 하게 만든다고? 스마트 포인터에 배우다 보면, make_shared 와 new 를 이용해 스마트 포인터를 만드는 방식에 대해 배우게 된다. 이때, 효율성을 위해 make_shared 를 new 보다 선호하라는 말을 듣게 되는데, 그 이유는 명확하다(힙 할당이 2번 대신 1번 이루어지며, 같은 메모리 조각에 놓이는 데다가, new 에서 예외가 발생했을 때의 메모리 누수도 막을 수 있으니까). 그런데... 그럼에도 불구하고 new 를 사용해야 하는 경우를 보면, 크게 2가지 이유가 나온다. 커스텀 삭제자를 사용하는 경우 생성자가 private 인 경우 100번 양보해서, 1번은 그렇다 쳐도, 2번은 직관적으로 와닿지가 ..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 RTTI RTTI 는 간단히 말해, 실시간 타입 정보라는 뜻이다. RTTI 라는 단어를 평소에는 잘 들어볼 일이 없다가, dynamic_cast 를 사용하기 위해 비주얼 스튜디오 옵션을 뒤적이던 중 해당 항목을 발견했다. 알다시피, C++ 는 리플렉션 기능을 제공하지 않는다. C# 에서는 리플렉션을 제공하는데, 해당 기능은 런타임에서 클래스 타입, 메소드, 프로퍼티 등의 메타 정보를 제공해 준다. 비주얼 스튜디오에서는 해당 기능을 끄고 킬 수 있게 만들어 놓았다. 간단히 말해, 해당 기능을 키게 되면 런타임에서 타입에 대한 정보를 얻을 수 있다. RTTI 는 가상 함수가 있는 클래스에 대해서만 동작하며, 이는 클래스의 타입 관련 정보가 v..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 파생 클래스에서의 기반 클래스 생성자 호출 사실 파생 클래스가 생성될 때, 기반 클래스 생성자가 호출된다는 건, C++ 을 조금이라도 해 본 사람은 누구나 알고 있는 사실이다. 또한 함수의 생성자/소멸자의 호출 순서가 다음과 같다는 것도, 익히 알려진 사실이다. 즉, A 클래스가 기반 클래스이고, B 클래스가 파생 클래스라고 가정했을 때 B 클래스 변수를 선언하면 호출 순서가 다음과 같이 나올 것이다 : A 클래스 생성자 B 클래스 생성자 B 클래스 소멸자 A 클래스 소멸자 하지만 한 가지 기억해야 할 것은, 파생 클래스를 만들 때 호출되는 기반 클래스 생성자는 '인자가 없는 기반 클래스의 생성자' 이다. 즉, 인자를 받는 형식의 기반 클..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 우측값과 좌측값 우리는 C++03 까지, 우리는 우측값과 좌측값 두 가지의 개념을 사용하여 코딩을 했었다. 간단히 말하자면, 좌측값은 '식의 좌측에 있는 변수'를, 우측값은 '식의 우측에 있는 값'을 의미했다. // a 는 좌측값, 5 는 우측값이다 int a = 5; 흔히들 좌측값을 '이름이 있는 녀석'으로 인식하기도 했다. 엄밀히 말하면 틀린 말은 아니다. 그런데 move semantics 가 도입되기 시작하면서, C++11 부터 대격변이 시작되는데... 여기서 많은 사람들이 좌측값과 우측값에 대한 개념을 헷갈려하기 시작한다(필자 포함). move semantics 가 뭔지 잘 모르겠다면, 이전 글(기초, 응용, 심화)을 꼭 읽고 오자..
C++ 에 대해 공부한 것과, 개발하면서 알게 된 것들을 다룹니다 const_cast 많은 사람들이 알고 있듯이, C++ 에서 제공하는 casting 의 종류는 크게 4 가지이다. 각 용도를 간단히 적어보면 다음과 같다 : static_cast : '일반적인' C 스타일의 캐스팅. 보통 업캐스팅(파생 클래스의 포인터를 기반 클래스의 포인터로 가리킴) 시 사용한다. dynamic_cast : 상속 관계에 있는 클래스들 사이의 캐스팅. 보통 다운 캐스팅(기반 클래스의 포인터를 파생 클래스의 포인터로 가리킴) 시 사용한다. 만약 실패하면 nullptr 를 리턴한다. 참고로, dynamic_cast 는 polymorphic 한 클래스만 가능한데, 간단히 말하면 virtual 함수가 포함된 클래스이어야 dynam..