기타: 123개의 글
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라는 똑같은 메모리 주소에 여러 값이 쓰여지는 것을 ..
C++에서 깊은 복사와 얕은 복사의 차이점을 알아보겠습니다. 간략하게 설명하면 얕은 복사는 C++에서 같은 타입의 객체를 복사할 때, 그 객체의 멤버 변수가 데이터를 가르키는 포인터라면 데이터 자체를 복사하는 것이 아닌 복사하고자 하는 객체의 멤버 변수가 가르키는 데이터를 참조하는 형식으로 복사가 진행됨을 뜻합니다. 깊은 복사는 반대로 참조하는 방식이 아닌 가르키는 데이터 그 자체를 복사하는 것이죠. 참조 자료 : http://sosal.kr/243 출처: https://engkimbs.tistory.com/148?category=688856 [새로비]
C++에서 가상함수의 동작원리는 이렇습니다. 클래스에 한 개 이상의 가상 함수가 있을 경우, 컴파일러는 실제 호출되어야할 함수의 위치 정보를 가지고 있는 가상 함수 테이블을 만들고, 클래스 객체에는 가상 함수 테이블을 위한 포인터를 추가합니다. 일반적으로 가상 함수가 있는 객체는 가상 함수 테이블에 있는 함수만을 호출하는 원칙을 가지고 있습니다. 가상 함수의 단점은 다른 블로거 분의 자료를 참고 했는 데 첫 번째로 가상함수를 쓰면 가상함수 테이블을 만들기 때문에 메모리 공간의 소모가 일어나게 된다는 것, 두번째로 직접 메소드에 엑세스 하는 것이 아니라 가상함수 테이블을 거쳐서 간접적으로 접근하기 때문에 속도면에서 느려질 수 있다는 단점이 있다고 합니다. 참고 자료: http://pacs.tistory.c..