C++ 람다 함수 (Lambda Function)
·
C++/Syntax
람다 함수 (Lambda Function) 익명 함수 기본 구조 : -> return type {} [] : 사용할 변수를 지정한다. & : 해당 스코프 변수들을 레퍼런스로 사용한다. 특정 변수명을 &name과 같은 식으로 불러오는 것도 가능하다. = : 해당 스코프 변수들의 값을 복사하여 사용하도록 한다. this : 클래스에서 this를 사용할 때 쓴다. () : 함수의 파라미터를 의미한다. -> : 함수의 반환형을 명시할 수 있다. (생략 시 void) {} : 함수의 body이다. 예제 간단한 숫자, 문자열, 클래스를 출력하는 예제 #include #include class A { std::string name_ = "default name"; public: A() { std::cout
C++ delete
·
C++/Syntax
delete 함수를 사용하지 못하도록 막는 역할을 하는 키워드이다. #include #include class Fraction { int numerator_; int denominator_; public: Fraction(char) = delete; explicit Fraction(int num = 0, int den = 1) : numerator_(num), denominator_(den) { std::cout
C++ 깊은 복사(Deep Copy)
·
C++/Syntax
깊은 복사(Deep Copy) 하위 항목을 모두 복사하는 것 #include #include class MyString { char* data_ = nullptr; int len_ = 0; public: MyString(const char* source = "") { assert(source); len_ = std::strlen(source) + 1; data_ = new char[len_]; for (int i = 0; i < len_; ++i) data_[i] = source[i]; data_[len_ - 1] = &#39;\0&#39;; } ~MyString() { delete[] data_; } MyString(const MyString& source) { std::cout
C++ 얕은 복사(Shallow Copy)
·
C++/Syntax
얕은 복사(Shallow Copy) 얕은 복사는 허상 포인터(Dangling pointer) 문제를 일으킬 수 있다. #include #include class MyString { char* data_ = nullptr; int len_ = 0; public: MyString(const char* source = "") { assert(source); len_ = std::strlen(source) + 1; data_ = new char[len_]; for (int i = 0; i < len_; ++i) data_[i] = source[i]; data_[len_ - 1] = &#39;\0&#39;; } ~MyString() { delete[] data_; } char*& getString() { retu..
C++ 함수 포인터 (Function Pointer)
·
C++/Syntax
함수 포인터 (Function Pointer) 기본 예제 배열에서 짝수, 홀수를 각각 출력하는 예제 간단한 버전 #include #include using namespace std; void printNumbers(const array& arr, \ bool print_even) { for (auto e : arr) if ((print_even && e % 2 == 0) || \ (!print_even && e % 2 == 1)) cout
C++ 인라인 함수 (Inline Function)
·
C++/Syntax
인라인 함수 (Inline Function) 함수 반환 값 정의 앞에 inline 키워드를 붙여주면 된다. 컴파일러가 인라인으로 넣을지 결정한다. inline 키워드를 넣지 않아도 인라인 함수로 작동시킬 때도 있고, 키워드를 넣어도 인라인 함수로 작동하지 않는 경우가 있다.
C++ 레퍼런스 (Reference, 참조)
·
C++/Syntax
레퍼런스 (Reference, 참조) 함수의 인자로 const int & 형태를 자주 사용하는 이유 레퍼런스 : 불필요한 복사가 발생하지 않아서 성능 상 이점을 가진다. const : rvalue도 인자로 넘길 수 있어서 확장성이 좋아진다. Call by Reference 포인터를 레퍼런스로 전달하는 방법 #include void foo(int*& ptr) { std::cout
C++ Stack Size
·
C++/Syntax
Stack Size VS에서는 아래와 같은 경우 경고를 띄운다. int main() { using namespace std; int arr[10000]; (void)arr; } 경고 내용 Warning C6262 Function uses &#39;40000&#39; bytes of stack: exceeds /analyze:stacksize &#39;16384&#39;. Consider moving some data to heap. 찾아보니 VS의 기본 스택 프레임 사이즈가 16KB로 설정되어있었고, 변경 가능하다. 스택 사이즈를 제한하는 이유는 쓰레드 개수의 확보를 위해서, 또 스택 오버플로우를 방지하기 위해서라고 한다. OS에 따라 스택 오버플로우 발생 시 자동으로 스택 사이즈를 늘리는 방식도 있다고..
C++ 문자열 (string)
·
C++/Syntax
문자열 (string) text segment #include int main() { using namespace std; const char* name = "Jack jack"; const char* name2 = "Jack jack"; cout
C++ nullptr_t
·
C++/Syntax
nullptr_t C++11 C언어에서 사용되지는 않으나, 라이브러리에 존재하는 자료형이다. #include #include void f(int*) { std::cout
C++ 배열 (Array)
·
C++/Syntax
배열 (Array) 상수 포인터, 포인터 상수는 무슨 의미인지는 알겠는데 사용하면 더 헷갈린다... 변수란 뭘까 #include int main() { using namespace std; int a = 1; cout
C++ 반복문
·
C++/Syntax
반복문 (Loop) unsigned int 의 연산이 일반적으로 int 보다 빠르다. 음수를 사용하는게 아니라면 unsigned int 자료형을 사용하는게 성능면에서 더 좋다.
C++ switch
·
C++/Syntax
switch switch문 내부에서 중괄호 없이 변수 선언은 가능하지만, 초기화는 안된다. 중괄호가 없으면 변수의 scope는 switch문의 중괄호까지인데, 서로 다른 case에서 변수에 접근은 가능하지만 초기화가 안된 상태로 접근할 수 있기 때문이다. 특별한 상황이 아니라면 이렇게 사용하는 것은 별로 추천하는 방법은 아니다. MS 에러 코드 #include int main() { using namespace std; int x; cin >> x; switch (x) { int a; // 이건 가능 int b = 5; // Error: initialization of &#39;b&#39; is skipped by &#39;case&#39; label case 0: int c; // 이것도 가능 int ..
C++ 제어 흐름 (Control Flow)
·
C++/Syntax
제어 흐름 (Control Flow) 중단(Halt) return, exit 점프(Jump) goto, break, continue 조건 분기(Conditional branches) if, switch 반복(Loop) while, do while, for 예외 처리(Exception) try, catch, throw
C++ Type Alias
·
C++/Syntax
Type Alias 자료형, 클래스 등을 다른 이름으로도 사용할 수 있게 해준다. typedef typedef vector pairlist_t; using using pairlist_t = vector;
C++ 열거형 (Enumerate Type)
·
C++/Syntax
열거형 (Enumerate Type) unscoped enum C++98 범위에 제한이 없어 모든 namespace에 선언된다. 따라서 이름이 중복되면 안된다. 정수 타입으로 묵시적 형변환된다. enum 변수에 숫자를 넣으려면 캐스팅을 해야 한다. #include enum Color { COLOR_BLACK, COLOR_RED, COLOR_BLUE, COLOR_GREEN }; int main() { using namespace std; int color_id = COLOR_RED; Color my_color1 = static_cast(color_id); Color my_color2 = static_cast(3); if (my_color1 < 2) cout
C++ 형변환 (Type Conversion)
·
C++/Syntax
형변환 (Type Conversion) 변환 방식 C Style (char)65 C++ Style char(65) static_cast(65) Numeric Promotion 크기가 작은 자료형에서 큰 자료형으로 형 변환하는 것 ex) float -> double 절삭(truncation) int i = 30000; // 0b111010100110000 short s = i; // 1바이트만 저장되어 0b00110000, 즉 48 double d = 0.123456789; float f = d; // 정밀도가 부족해서 다른 값이 저장됨 묵시적 형변환(implicit type conversion)에서의 자료형 별 우선 순위 long double (highest) double float unsigned lo..
C++ 자료형 추론 (auto, decltype)
·
C++/Syntax
자료형 추론 (auto, decltype) C++11 자료형을 기본 타입 형태로 추론한다. 자료형을 명시하기 복잡하거나 귀찮을 때 사용한다. 가독성이 좋다. 함수의 반환 값에도 적용할 수 있다. Trailing Return Type(후행 반환 형식) auto 키워드로 정의된 함수 반환 값의 자료형을 명시하는 것 함수 앞에 자료형을 쓰는 것보다 가독성이 좋고, 인덴팅을 맞추기도 편하다. auto add(int x, int y) -> int; auto add(double x, double y) -> double; 예제 iterator 대체 개인적으로 이 때 제일 많이 사용하는 것 같다. #include #include int main() { using namespace std; vector vec({ 1, ..
C++ using
·
C++/Syntax
using using std::cout; 이라고 선언해두면 cout만 써도 std::cout을 사용할 수 있다. 편하지만 남발하면 모호성이 생겨서 컴파일이 안될 수 있다. 영역을 최소한으로 잡아서 사용할 것 상속의 접근 권한을 변경할 때도 사용할 수 있다.
C++ extern
·
C++/Syntax
extern 함수의 경우 기본적으로 extern이 생략되어 있는 것이다. 변수의 경우 가져다 쓰는 파일에서 forward declaration 할 때 앞에 extern을 붙여주어야 한다. 이를 통해 External Linkage 속성을 가진다. main.cpp #include extern int a; // OK int a; // Linking Error int main() { using namespace std; cout
C++ 범위 지정 연산자 (Scope Resolution Operator)
·
C++/Syntax
범위 지정 연산자 (Scope Resolution Operator) :: 클래스, 함수 이름 충돌을 해결할 수 있다. 앞에 아무것도 안쓰면 전역 변수를 불러올 수 있다. #include int value = 123; int main() { std::cout
C++ 비트 연산자 (Bitwise Operator)
·
C++/Syntax
비트 연산자 (Bitwise Operator) 빠르다. 라이브러리를 통해 비트를 그대로 출력 가능하다. unsigned int a = 3; std::cout
C++ 쉼표 연산자 (Comma Operator)
·
C++/Syntax
쉼표 연산자 (Comma Operator) 순차적으로 계산한 뒤 마지막 계산 결과를 반환한다. 일반적으로 잘 쓰이지 않고, for문에서나 가끔 쓰이는 정도라고 한다. int x = 3; int y = 10; int z = (++x, ++y); int i, j; for (i = 1, j = 1; i < 5; ++i, j += 2) myFunc((j--, i + 2), z);
C++ 산술 연산자 (Arithmetic Operator)
·
C++/Syntax
산술 연산자 (Arithmetic Operator) 음수 나누기 std::cout
C++ 상수 (Constant)
·
C++/Syntax
상수 (Constant) Literal constant 숫자, 문자 등 메모리에 존재하지 않아도 사용 가능한 값 Binary Literal C++14 0b1011&#39;1111&#39;1010 Symbolic constant Compile Time constant 컴파일할 때 값이 결정되는 상수 constexpr C++11 컴파일 타임에 값이 결정되는 상수에만 사용 가능한 키워드이다. Runtime constant 런타임에 값이 결정되는 상수 매크로 C 스타일에서는 상수를 매크로로 정의했지만, C++에서는 그렇게 사용하지 않는다고 한다. 이유 디버깅이 귀찮아진다. 적용 범위가 너무 넓다. 대신에 함수 내에서 const 형식으로 작성하는 것이 일반적이라고 한다. const_cast const로 지정한 상..
C++ 형 변환 (Type Casting)
·
C++/Syntax
형변환 (Type Casting) 변환 방식 C Style(char)65 C++ Stylechar(65) static_cast(65) numeric promotion 크기가 작은 자료형에서 큰 자료형으로 형 변환하는 것 ex) float -> double 절삭(truncation) int i = 30000; // 0b111010100110000 short s = i; // 1바이트만 저장되어 0b00110000, 즉 48 double d = 0.123456789; float f = d; // 정밀도가 부족해서 다른 값이 저장됨 묵시적 형변환(implicit type conversion)에서의 자료형 별 우선 순위 long double (highest) double float unsigned long lo..
C++ Boolean
·
C++/Syntax
Boolean true, false 출력 bool b{true}; std::cout
C++ 소수점 (Decimal Point)
·
C++/Syntax
소수점 (Decimal Point) 고정 소수점 (정수) 부호화 절대치 맨 왼쪽 비트가 부호를 결정하고, 나머지 비트는 일반 양수를 다루듯 계산한다. 000 -> +0 001 -> +1 010 -> +2 011 -> +3 100 -> -0 101 -> -1 110 -> -2 111 -> -3 안쓰는 이유 순환성이 떨어진다.(+3 다음이 -0) 보수를 사용하면 감산기 없이 가산기만으로 뺄셈이 가능하다. 1의 보수 비트를 반전시켜 순환성을 가지도록 했다.(+3 다음이 -3) 덧셈기로 뺄셈이 가능하다. 000 -> +0 001 -> +1 010 -> +2 011 -> +3 100 -> -3 101 -> -2 110 -> -1 111 -> -0 2의 보수 1의 보수를 취하고 1을 더하는 형태이다. -0을 없애고..
C++ 자료형 (Data Type)
·
C++/Syntax
자료형 (Data Type) 라이브러리 자료형의 최대, 최소 확인 std::cout
C++ 전처리기 (Preprocessor)
·
C++/Syntax
전처리기 (Preprocessor) 기능 파일 포함시키기 #include 특정 파일을 현재 위치에 첨부하여 하나의 파일처럼 컴파일한다. 조건부 컴파일 #if, #elif, #else, #ifdef, #ifndef, #endif 등 조건에 해당되는 코드만 실행한다. defined 키워드와 같이 사용하여 복합적으로 정의할 수 있다. OS에 따라 다른 파일을 포함시키는 예제 #ifdef __unix__ /* __unix__ is usually defined by compilers targeting Unix systems */ # include #elif defined _WIN32 /* _Win32 is usually defined by compilers targeting 32 or 64 bit Windows ..