새로운 데이터 타입

  • char16_t (UTF16, cpp11)

  • char32_t (UTF32, cpp11)

  • char8_t (UTF8, cpp20)

  • https://velog.io/@ts6938/UTF-8%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

    UTF-8 : 1~4byte 사이로 인코딩하는 가변 길이 인코딩 방식

    UTF-16: 2byte 가변길이 인코딩 방식 → 영문과 한글이 2byte라 UTF-8에 비해 저장 공간 효율성이 있으나 byte ordering고려해야함

    UTF-32: 모든 문자를 4바이트 고정 길이로 인코딩해서 편리하나 저장공간 사용 많음

    BOM(Byte Order Mark): 바이트 순서 표시

auto/decltype/nullptr

  • auto (c++11)

    • 한 쪽의 데이터 타입이 변경됐을 때 바로 대응가능
    • int x[5] = {1,..} auto n1 = x[0];
  • decltype (c++11)

      decltype(n1) n3 // 기본 사용법
    int foo (int a, double d)
    decltype(foo) d1; // 함수 타입
    decltype(&foo) d2; // 함수 포인터 타입
    decltype(foo(1, 3.1)) d3; // 함수 반환 타입 // 실제 함수가 호출되지않아서 unevaluated expression이라고 함
    #include <typeinfo>
    cout << typeid(d1).name() << endl; // 타입검출 (!const, volatile, reference 검출 불가, boost 필요)
      
    • n1의 타입으로 n3 결정
  • 컴파일 시간에 결정되므로 실행시간 오버헤드는 없음

  • 유의

      int x[3] = {1,2,3}
    auto a2 = x; // int*
    decltype(x) d2; // int d2[3]
    decltype(x) d3 = x; // error
    int y[2] = {1,2}
    auto a4 = y[0]; // int
    decltype(y[0]) d4; // int&
      
  • nullptr

    • 리터럴
      • 소스 코드 내에서 사용되는 고정된 값
      • 모든 리터럴은 데이터 타입이 있음
    • 정의
      • pointer literal
      • 데이터 타입은
    • 암시적 변환
      • 모든 포인터 타입으로 암시적 변환 가능
      • int 타입으로는 변환 불가
      • bool의 경우 복사 초기화는 불가, 직접 초기화는 가능
        • bool b1 = nullptr // error bool b2 {nullptr}

using

  • C++ 11부터 도입
  • using은 타입 뿐 아니라 템플릿의 별칭도 만들 수 있음
  typedef int DWORD;
typedef void(*F)(int, int);
using DWORD = int;
using F = void(*)(int, int);
  

linkage

  • 정의
    • 어떤 심볼이 자신이 정의된 컴파일 단위(파일) 외에서도 접근가능한가
  • 종류
    • Interanl(같은 파일) ↔ external(모든 파일)
  • 헤더 파일에 함수 구현 넣기
    • static, inline function만 가능
    • 차이
      • static같은 경우 a.cpp와 b.cpp의 함수는 다른 함수. 주소가 다름
      • inline은 동일 주소
  • no linkage
    • 특정 scope 안에서 만들어져서 같은 파일이라도 접근 불가능한 케이스
  • 결론
    • header에는 internal linkage만 넣을 수 있음.
    • inline은 multiple definition이 허용되는 특별한 경우
    • 변수의 경우 static, const, inline var이 가능
      // linkage.h
    static int s = 0; // linkage.h를 include한 파일들에서 다른 주소
    const int x = 0; // 다른 주소
    inline int y = 0; // 같은 주소