분류 전체보기
-
[Effective Modern C++] Special member functionC++/Effective Modern C++ 2022. 5. 5. 13:38
특수 멤버 함수(Special member function)는 C++이 자동으로 작성하는 멤버 함수들을 가리킵니다. C++98까지는 기본 생성자, 소멸자, 복사 생성자, 복사 배정 연산자가 이에 해당되었고, C++11에 이동 시맨틱이 추가되면서 이동 생성자, 이동 배정 연산자가 추가되었습니다. 위 함수들은 클라이언트 코드에서 호출되었을 경우에만 작성되며, 묵시적으로 public이며 inline입니다. 또한, 자동 생성될 때 상위 클래스가 가상 소멸자인 경우를 제외하면 모두 non-virtual함수입니다. 특수 멤버 함수의 작성 조건은 우선적으로 클라이언트 코드에서의 호출이지만, 작성되지 않는 경우도 존재합니다. 특정 조건 하에서 호출되어도 작성되지 않는 경우들이 존재하는데, 대표적인 예시로 기본 생성자의..
-
[Effective Modern C++] const와 Thread safetyC++/Effective Modern C++ 2022. 5. 3. 15:02
const로 선언된 함수는 내부에서 값의 수정이 일어나지 않는다고 기대할 수 있습니다. 그리고 이러한 함수는 멀티스레드 프로그램에서 스레드에 안전할 것 입니다. 하지만, 예외되는 경우가 존재하는데, 이번 글에서는 이에 대해서 살펴보도록 하겠습니다. 생각할 수 있는 가장 간단한 예제는 아래와 같습니다. class MyClass{ public: int calc() const { if (!data_valid){ ... data_valid = true; } return data; } private: mutable bool data_valid { false }; mutable int data { 0 }; }; 함수의 값을 계산하고 캐싱하는 예제입니다. 값에 대한 계산 비용이 큰 값들의 경우 위와 같이 캐싱하는 방..
-
[Effective Modern C++] constexprC++/Effective Modern C++ 2022. 4. 29. 15:23
constexpr은 Constant expression이지만, 기존의 const예약어와는 조금 다릅니다. 개념적으로 constexpr은 해당 값이 상수 뿐 아니라, 컴파일 시점에 알려지는 값을 나타냅니다. 그 외에도 함수, 생성자 등에 적용 가능하다는 특성 또한 존재하며, constexpr이 적용된 식 등이 항상 const하지는 않다는 특징이 있습니다. 단점이 아닌 특징으로, 이것은 constexpr의 기능에 속합니다. 이번 글에서는 constexpr에 대하여 알아보도록 하겠습니다. 1. constexpr객체와 상수성 더보기 constexpr객체는 const이지만, const객체는 constexpr이 아닙니다. 이것은 상수 표현식이 필요한 구문에서 차이를 살펴볼 수 있습니다. 예제를 살펴보도록 하겠습니다..
-
[Effective Modern C++] noexceptC++/Effective Modern C++ 2022. 4. 28. 11:35
예외 처리에 대한 기초적인 내용은 다른 글 (예외 처리)에 간략히 정리되어 있습니다. 함수의 예외 방출 여부는 매우 중요한 사항입니다. 클라이언트(사용자) 입장에서는 기존의 코드를 바꾸어야 할 수도 있고, 컴파일러의 입장에서는 최적화와 관련이 크기 때문입니다. 이렇듯 예외처리에서 가장 중요한것은 예외가 발생할 수 있는지 아닌지의 정보입니다. 이분법적인 정보가 중요한 만큼, C++11에서는 예외를 방출하지 않는 선언을 하는 noexcept 키워드가 추가되었습니다. 1. noexcept와 Stack unwind 더보기 함수에서 예외를 방출하지 않는다는 선언은 다음과 같습니다. //C++98 Style void function() throw(); //C++11 Style void function() noexc..
-
[Effective Modern C++] const_iteratorC++/Effective Modern C++ 2022. 4. 27. 13:39
const_iterator는 문자 그대로 const한 iterator입니다. const를 사용하는게 가능하다면 const를 사용하는 것은 iterator에도 적용이 되어, 값을 수정할 필요가 없을 때에는 const_iterator를 쓰는 것이 바람직합니다. 하지만, C++11 이전에는 이 const_iterator를 사용하는 것이 조금 난해했습니다. 이번 글에서는 const_iterator에 대하여 다루어 보겠습니다. std::vector에서 1이라는 값을 찾고 그 앞에 2를 삽입하는, 혹은 값이 존재하지 않을 경우 벡터의 끝에 2를 삽입하는 코드는 아래와 같이 작성할 수 있습니다. std::vector vec; ... std::vector::iterator it = std::find(vec.begin(..
-
[Effective Modern C++] 식별자 : overrideC++/Effective Modern C++ 2022. 4. 22. 17:38
override 식별자는 C++11에서 추가된 식별자입니다. 이 식별자는 const, virtual등의 기능적인 역할을 하는 것이 아닌, 알리는 (Notify)역할을 하는 식별자 입니다. 특이한 점은, 기존에 기능, 가독성을 위해 사용한 기법들 (delete, static_cast 등)과는 다르게, 알리는 대상이 컴파일러 라는 것 입니다. 이번 글에서는 override의 사용에 대해 살펴보도록 하겠습니다. 1. 가상 함수 & 비 가상 함수 더보기 예제를 살펴보도록 하겠습니다. #include using namespace std; class Anc { public: void func1() { std::cout
-
[Effective Modern C++] private와 deleteC++/Effective Modern C++ 2022. 4. 22. 17:37
함수를 하나 정의해보겠습니다. 이 함수는 정수를 하나 받아서 당첨 번호인지 반환해주는 함수입니다. bool is_chosen(int number) { ... } 이 함수는 본래의 의도와는 다른 방향으로 사용될 여지가 존재합니다. if (is_chosen('a')) { ... } if (is_chosen(true)) { ... } if (is_chosen(3.5)) { ... } 위와 같은 함수 호출은 인자들이 묵시적으로 int로 변환되어 전달됩니다. 이런 상황을 방지하기 위해, 개발자는 특정 형식들에 대한 함수의 오버로딩을 삭제할 수 있습니다. 이번 글에서는 함수의 삭제에 대해 살펴보겠습니다. 1. 함수 삭제하기 더보기 서론에 언급한, is_chosen(int)함수가 다른 형식으로 호출되는 것을 막기 위..
-
[Effective Modern C++] enum과 enum 클래스C++/Effective Modern C++ 2022. 4. 18. 13:37
C++98스타일의 enum은 C++의 기본 스코프 규칙이 적용되지 않습니다. enum Color { black, white, red }; auto white = 0; C2365 : 'white': 재정의: 이전 정의는 '열거자'입니다. enum의 열거자들은 enum을 포함하는 범위에 속하여, 위와 같이 자신들의 이름이 범위 밖으로 나가는 것을 볼 수 있습니다. C++에서는 새로이 enum class가 추가되었는데, 이번 글에서는 그에 대해 다루어 보도록 하겠습니다. 1. Scoped enum 더보기 범위 있는 enum (Scopred enum)은 enum class를 부르는 말 입니다. 예제를 살펴보도록 하겠습니다. enum class Color { black, white, red }; auto whit..