C++ - mordern c++ type

mohadang·2022년 10월 10일
0

C++

목록 보기
24/48
post-thumbnail

nullptr

  • NULL을 쓰면 가끔 뭔가 굉장히 이상한 일이 벌러짐
float GetScore(const char* name);
float GetScore(int id);

Class* myClass = new Class("COMP3100");

int score = myClass->GetScore(NULL);
/*

어떤 함수가 호출될까??
float GetScore(int id); 이 호출 됨...
*/
  • NULL vs nullptr
#define NULL 0 // 숫자
typedef decltype(nullptr) nullptr_t; // null 포인터 상수

int number = NULL;// OK
int* ptr = NULL;// OK

int anotherNumber = nullptr;// ERROR
int* anotherPtr = nullptr;// OK
  • nullptr 은 메모리 상으로는 0이지만 컴파일 중에 포인터가 아니면 에러를 발생 시켜준다.

  • NULL대신 nullptr을 사용해야 한다. 더 이상 NULL이 있을 곳이 없다. NULL은 과거의 호환성때문에 존재할 뿐이다.

고정 폭 정수형(fixed-sidth integer types)

  • 아래 자료형등의 바이트 크기는 얼마일까?
char
short
long
long long
int
  • '사실 위의 데이터 크기는 표준이 없다. 따라서 int가 12바이트여도 할 말이 없다.'

  • 왜 이런 것들을 외워야 될까??

  • 각 자료형이 내 컴파일러에서 몇바이트인지 알 고 싶다...

  • C++ 11에서 지원

  • 가독성 향상을 위해 낡은 기존 자료형보다 이것들을 쓰자

int8_t score = Student>GetScore();
// 데이터 범위를 표현하기가 더 좋음.

Enum class

  • C#은 Enum이 type인것 같다.
  • C 스타일 Enum
enum eScoreType
{
  Assignment1,// 0
  Assignment2,
  Assignment3,
  Midterm,
  Count,      // 4, 배열 잡을때 Count를 이용해 배열 잡음.
};

enum eStudyType
{
  Fulltime,// 0
  Parttime,// 1
};
  :
  :

int num = Assignment3;// 에러 안 남

eScoreType type = Midterm;
if(type == Fulltime)// 에러 안 남.
{
}

// Type Checking이 없기 때문에 문제이다.
  • enum class
enum class eScoreType
{
  Assignment1,// 0
  Assignment2,
  Assignment3,
  Midterm,
  Count,      // 4, 배열 잡을때 Count를 이용해 배열 잡음.
};

enum class eStudyType
{
  Fulltime,// 0
  Parttime,// 1
};
  :
  :

int num = eScoreType::Assignment3;// 에러 발생 시킴

eScoreType type = eScoreType::Midterm;
if(type == eStudyType::Fulltime)// 에러 발생 시킴
{
}
  • enum class

    • C++11에서 제대로 지원, 하나의 독자적인 타입으로 인정
    • 정수형으로의 암시적 캐스팅이 없음
    • 자료형 검사
    • 또한 enum에 할당할 바이트 양을 정할 수도 있음
      • enum 값을 파일에 저장할 때 몇 바이트 저장할 지 알아야 하는 경우 있음
    enum class eScoreType : uint8_t
    {
      Assignment1, // 0
      Assignment2,
      Assignment3,
      Midterm,
      Final,      0x100, // 경고, 12bit
    };
  • 허나 이렇게 할 수는 없음 :(

    • 컴파일 안됨
    for(int i = eScoreType::Assignment1; i < eScoreType::Count; ++i)
    {
      // 점수들 처리
    }
    • 다음 방식 사용하면 컴파일 됨
    for(int i = static_cast<int>(eScoreType::Assignment1);
      i < static_cast<int>(eScoreType::Count);
      ++i)
    {
      // 점수들 처리
    }
profile
mohadang

0개의 댓글