기타/C++: 40개의 글
• C++ 11특징 - C++ 11 은 2011년 8월 12일 ISO c++ 표준 위원회의 만장 일치로 통과 되었습니다. 표준으로 인정받은 해에 맞춰 C++ 11이라는 명칭으로 정해졌습니다. - 안정성 및 C++98과의 호환성을 유지 합니다. - 이전의 안전하지 않은 기술에 대해 좀 더 안전한 대안을 제공 합니다. - "부담 최소화"의 원칙. 어떤 유틸리티가 필요로하는 추가적인 자원은 그 유틸리티를 사용할 때만 필요해야 합니다. - 문법의 편의성이 크게 향상 되었습니다. 템플릿에서 가변 인자 새로운 문자열 리터럴 사용자 정의 리터럴 멀티태스킹 메모리 모델 TLS (Thread Local Storage) 특수 멤버 함수의 기본값 사용 및 삭제에 대한 명시적 표시 long long int 타입 정적 asse..
stod를 사용하면 된다. 그리고 자동적으로 앞뒤 공백까지 제거해주니 편하다 #include #include using namespace std; int main() { cout
STL을 사용하여 문자열을 뒤집을 수 있다. 현재 문자열 자체를 뒤집으므로 원본을 보존할 경우라면 복사해서 써야한다. #include #include #include int main() { std::string foo("foo"); std::string copy(foo); std::cout
int check_overflow(int num1, int num2) { // 여기가 핵심. num1 + num2 > INT_MAX를 변형한 것 // 위 식을 그대로 쓸 경우 num1 + num2 자체에서 오버플로우가 일어나 계산이 안 됨 if (num1 > INT_MAX - num2) return -1; else return num1 + num2; } int main() { int num1 = 2147483627; int num2 = 20; int result = check_overflow(num1, num2); if (result == -1) std::cout
Boost 라이브러리를 사용하지 않고 문자열 앞뒤 공백 제거할 수 있는 방법을 발견했다. 고마워요 스택오버플로우 // trim from left inline std::string& ltrim(std::string& s, const char* t = " \t\n\r\f\v") { s.erase(0, s.find_first_not_of(t)); return s; } // trim from right inline std::string& rtrim(std::string& s, const char* t = " \t\n\r\f\v") { s.erase(s.find_last_not_of(t) + 1); return s; } // trim from left & right inline std::string& trim(s..
네임스페이스는 선언을 그룹핑하는 언어적 메커니즘입니다. 프로젝트를 진행하는 도중 어떤 누군가가 같은 함수 혹은 변수를 선언해도 네임스페이스로 그룹핑 되어 있을 시, 다른 사람이 작성한 코드와 충돌되지 않습니다. 아래는 c++에서 네임스페이스를 사용한 예시입니다. namespace TextLib { class Text {...}; class Line {...}; ... string text_value; int line; } namespace FileTextLib { class Text {...}; class Line {...}; ... string text_value; int line; } 그리고 위와 같이 정의된 네임스페이스는 완전 한정 이름(fully qualified name)을 써서 사용할 수 있습..
constexpr 키워드는 컴파일러가 함수를 계산하게 하는 키워드입니다. 다음과 같이 함수 인자로 상수 표현식을 취하는 경우에 컴파일러가 constexpr 함수를 계산할 수 있습니다. C++11에서는 constexpr기능을 확장하여 하나의 return 구문으로만 이루어질 수 있으며, C++14에서는 간단한 루프도 허용이 됩니다. 다음은 constexpr 표현식과 문법 규칙을 설명한 내용입니다. // constexpr example constexpr double scale = 10; constexpr Point scale(Point p) { return xscale * xscale; } int glob = 9; constexpr void bad(int &arg){ // error : no return st..
C++에서 헤더는 "어딘가에" 정의된 기능의 선언을 관리하는 영역을 의미합니다. 기본적으로 헤더는 선언을 모아둔 것으로 그것을 기술한 파일이 바로 헤더 파일입니다. 헤더 파일은 #include를 이용해서 소스에 포함시킬 수 있습니다. 예를 들어 다음과 같이 Token 코드의 구조를 개선하고자 Token 코드의 선언과 정의 부분을 분리할 때 아래와 같이 Token.h 파일을 만들 수 있습니다. 아래는 각 소스 파일을 구현한 코드입니다. // Main.cpp #include "Token.h" int main() { Token token1(4); Token token2(5); token1.printToken(); token2.printToken(); return 0; } // Token.cpp #include..
스마트 포인터는 C++에서 포인터 때문에 생기는 여러 문제점(메모리 누수, dangling pointer, 할당 실패)을 보완하는 객체입니다. 이 스마트 포인터의 정체는 다름 아닌 포인터를 감싸는 단순한 wrapper라고 보시면 되죠. template class auto_ptr { T* ptr; public: explicit auto_ptr(T* p = 0) : ptr(p) {} ~auto_ptr() {delete ptr;} T& operator*() {return *ptr;} T* operator->() {return ptr;} // ... }; 위의 코드를 참고해보면 방금 설명한 스마트 포인터는 포인터를 감싸는 단순한 wrapper라는 것을 알 수 있죠. 여기서의 핵심은 소멸자에 있습니다. 바로 pt..
volatile은 외부적인 요인으로 그 값이 언제든지 바뀔 수 있음을 명시하는 선언문에 쓰이는 키워드입니다. 따라서 컴파일러는 volatile 선언된 변수에 대해서는 최적화를 수행하지 않습니다. volatile 변수를 참조할 경우 레지스터에 로드된 값을 사용하지 않고 매번 메모리르 참조하죠. 다음을 보시면 감이 잡히실 겁니다. *(unsigned int *)0x8C0F = 0x8001 *(unsigned int *)0x8C0F = 0x8002; *(unsigned int *)0x8C0F = 0x8003; *(unsigned int *)0x8C0F = 0x8004; *(unsigned int *)0x8C0F = 0x8005; 위의 코드를 보면 0x8C0F라는 똑같은 메모리 주소에 여러 값이 쓰여지는 것을 ..