반응형
Language/C++
[C++11] keyword: static_assert
[C++11] keyword: static_assert
2020.07.231. 설명 statc_assert는 C++11에 추가된 키워드로, 인자로 전달된 식이 참인지 아닌지 컴파일 타임에 확인한다. static_assert에 전달된 식이 참이라면, 컴파일러에 의해 해당 식은 무시되고, 거짓이라면 해당 문장에서 컴파일 오류를 발생시킨다. static_assert( constant-expression, string-literal ); static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later) 컴파일 타임에 수행되는 키워드이므로 첫 번째 인자 역시 컴파일 타임여 결정될 수 있는 인자여야 한다. static_assert(sizeof(void *) == 4, "64-bit code generation is..
[C++] keyword: enum class
[C++] keyword: enum class
2020.07.231. 설명 C++03까지의 enum은 여러가지 문제를 가지고 있었다. 그래서 그 문제를 해결하고자 C++11부터 enum class라는 것이 등장했다. 기존 enum의 문제점들은 다음과 같다. 1.1) 기존 enum의 문제 1.1.1) 전방 선언 불가능 기존 enum은 enumerator에 어떤 값이 들어있을지 알 수 없으면 그 크기를 정할 수 없기 때문에 전방 선언을 할 수 없다. enum Fruit; // 전방 선언 불가능 void main() { Fruit f = Apple; // 따라서 해당 enum을 찾을수 없음 } enum Fruit { Apple, Banana, Peach, }; 따라서 위와 같이 컴파일을 할 수 없으며 매 파일 상단에 enum을 정의해줘야 하는 불편함이 있다. 1.1.2) ..
[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast
[C++] keyword: static_cast, dynamic_cast, reinterpret_cast, const_cast
2020.07.231. 설명 C의 캐스트 연산자는 변수의 타입을 바꿀 수 있다는 면에서 편리하고 유연한 코드 작성을 도와준다. 하지만 너무 무책임하고 개발자에게 모든 것을 떠넘긴다. C++에서는 좀 더 안전하고 변환 목적에 맞게 골라 쓸 수 있는 4개의 새로운 캐스트 연산자를 제공한다. static_cast reinterpret_cast dynamic_cast const_cat 1.1) static_cast static_cast 연산자는 지정한 타입으로 변경하는데 무조건 변경하는 것이 아니라 논리적으로 변환 가능한 타입만 변환한다. void main() { const char* str = "korea"; int* pi; double d = 123.456; int i; i = static_cast(d); // 가능 pi =..
[C++] keyword: noexcept
[C++] keyword: noexcept
2020.07.231. 설명 만약에 어떤 함수가 예외를 발생시키지 않는다면 noexcept 키워드를 통해 명시할 수 있다. int foo() noexcept {} foo 함수의 경우 예외를 발생시키지 않으므로 위와 같이 함수 정의 옆에 noexcept를 넣음으로써 나타낼 수 있다. #include using namespace std; int foo() noexcept { return 0; } int bar() noexcept { throw 1; } int main() { foo(); try { bar(); } catch (int x) { std::cout
[C++11] keyword: constexpr
[C++11] keyword: constexpr
2020.07.231. 설명 constexpr 키워드는 객체나 함수 앞에 붙일 수 있는 키워드로, 해당 객체나 함수의 리턴 값을 컴파일 타임에 값을 알 수 있다는 의미를 전달한다. int arr[size]; 위 배열 선언식이 컴파일되기 위해서는 size가 정수 상수 식이여야 하고 template struct A { int operator()() { return N; } }; A a; 템플릿 타입 인자의 경우도 마찬가지로 number가 정수 상수식이여만 한다. 그 외에도, enum A { a = number, b, c }; enum에서 값을 지정해줄 때에 오는 number 역시 정수 상수 식이여만 한다. constexpr은 앞서 말한 대로, 어떠한 식이 상수식이라고 명시해주는 키워드다. #include using names..
[C++] keyword: using
[C++] keyword: using
2020.07.231. 설명 using 키워드는 다음과 같이 활용할 수 있다. 1. namespace using 지시자(Directive) 2. namespace using 선언(Declaration) 3. 타입 정의 4. 클래스 계층에서의 사용 1.1) namespace using 지시자(Directive) 네임 스페이스는 명칭의 선언 영역을 분리해서 충돌을 방지한다. 그래서 네임 스페이스 안에 명칭을 선언하면 이름을 붙일 때 충돌을 걱정하지 않고 자유롭게 이름을 붙일 수 있다. 그러나 이렇게 작성된 명칭을 사용하려면 매번 소속을 밝혀야 하므로 매우 번거롭다. 따라서 using namespace (네임 스페이스 이름)을 통해 매번 네임 스페이스를 생략하고 바로 사용할 수 있다. #include using namespac..
[C++] keyword: friend
[C++] keyword: friend
2020.07.231. 설명 friend 키워드는 클래스 내부에서 다른 클래스나 함수들을 friend로 정의할 수 있다. friend로 정의된 클래스나 함수들은 원래의 클래스의 private로 정의된 변수나 함수들에 접근할 수 있다. class A { private: void private_func() {} int private_num; // B 는 A 의 친구! friend class B; // func 은 A 의 친구! friend void func(); }; class B { public: void b() { A a; // 비록 private 함수의 필드들이지만 친구이기 때문에 접근 가능하다. a.private_func(); a.private_num = 2; } }; void func() { A a; // 비록 pr..
[C++] keyword: static
[C++] keyword: static
2020.07.231. 설명 static 키워드는 C++에서 특별한 특성을 부여하는 데 사용한다. static으로 선언된 것들은 프로그램 실행 시간 동안 한 번만 정적 데이터 영역에 저장되고, 프로그램 실행 동안 유지된다. static 키워드는 다음과 같이 사용된다. 1. 함수 내에서 static 변수 2. static 클래스 객체 3. 클래스 내 static 멤버 변수 4. 클래스 내 static 함수 2. 예시 2.1) 함수 내에서 static 변수 #include using namespace std; void counter() { static int count = 0; cout
[C++] keyword: explicit
[C++] keyword: explicit
2020.07.221. 설명 explicit 키워드를 사용하면 컴파일러의 암시적 형변환을 막을 수 있다. class A { public: int num; explicit A(int num) : num(num) {} }; 2. 예시 2.1) explicit 키워드를 사용하지 않은 경우(암시적 형변환이 일어난 경우) #include using namespace std; class A { public: int num; A(int num) : num(num) {} }; void print_a(A a) { cout
[C++] keyword: inline, __inline, __forceinline
[C++] keyword: inline, __inline, __forceinline
2020.07.221. 설명 1.1) inline inline 키워드는 함수 호출 시 발생하는 오버헤드를 줄이기 위해 함수를 호출하는 대신 함수가 호출되는 곳마다 함수의 코드를 복사해 넣어주는 방법이다. 그렇다면 함수 호출 시 발생하는 오버헤드는 뭘까? 실제로 함수가 호출되는 과정을 요약하면 1. 함수의 인자를 스택에 저장 2. 함수가 리턴될 때 돌아올 주소를 스택이나 레지스터에 저장 3. 함수의 시작 주소로 점프 4. 함수의 코드 실행 5. 함수에서 만들어진 지역변수, 스택에 저장된 인자 해제, 리턴 값을 레지스터에 저장 6. 함수를 호출 할 때 저장해둔 주소로 되돌아감 위와 같은 과정을 거치는데 간단한 함수를 호출하기 위해서 저런 명령어들을 수행해야 한다면 오버헤드가 될 수밖에 없다. 이런 오버 헤드를 줄이기 위해 C..
[C++] keyword: const
[C++] keyword: const
2020.07.221. 설명 const 키워드와 함께 정의한 변수의 값은 수정이 불가능하다. 즉, 상수화 되어버리는데 프로그래밍 시 바뀌면 안 될 값이 있을 경우 유용하다. 코드가 길어질 실수로 변수의 값이 바뀌어 지는 것을 방지할 경우 활용할 수 있다. 2. 예시 2.1) 일반적인 경우 const int a = 1; a = 5; // error! 한번 설정된 a는 read-only memory에 올라가게 되고 변경할 수 없게 된다. 2.1) 함수 내 인자값에서 활용하는 경우 class Child { public: int age; string name; string address; Child() = default; Child(int age, string name, string address) : age(age), name..
[C++11] keyword: final
[C++11] keyword: final
2020.07.221. 설명 final 키워드를 사용하면 클래스나 멤버 함수의 상속을 막을 수 있다. class Parent final // 클래스에 final 키워드를 사용 한 경우 2. 예시 2.1) final로 선언 된 클래스를 상속했을 시 #include using namespace std; class Parent final { public: Parent() { cout