New Rules (CPP 02-08)

클래스들이 Orthodox Canonical Form에 맞추어 작성되어야함
따라서 아래의 멤버 함수들이 필수로 포함되어있도록 작성

  • 기본 생성자
  • 복사 생성자
  • 대입 연산자
  • 소멸자

Exercise 00 : My First Class in Orthodox Canonical Form

Orthodox Canonical Form 형식에 맞는 클래스를 만들어낼 수 있는지 확인하는 문제
멤버 변수들은 모두 private으로 설정

  • fractional_bits 변수는 static으로 받아 모든 객체에서 값이 공유되도록 설정
  • fixed_valueprivate으로 설정해 클래스 외부에서 접근할 수 없기 때문에 getRawBits()setRawBits() 함수를 만들어서 사용
    • 변수에 접근시 const 제한자를 적절하게 사용할 필요가 있음
    • 멤버 함수 뒤에 const를 선언할경우 해당 함수에서 멤버 변수의 값을 변경하지 않음을 의미
    • 매개변수에 const 선언시 해당 매개변수의 값을 변경하지 않음을 의미

CPP02의 과제에서 private 멤버 변수를 외부에서 접근할 일은 없으나, private 멤버 변수에 대해 gettersetter를 관습적으로 사용한다고 함
변수를 public으로 두고 사용하지 않고 이처럼 사용하는 것을 데이터 은닉이라고 함
이에 대해 이미 정리해놓은 내용이 존재 - 10.2를 참조



CPP02의 과제를 풀기 위해서는 고정 소수점에 대한 이해가 필요

부동 소수점(Floating-point)

  • 비트를 세 부분으로 쪼개어서 사용
  • 부호 / 지수부 / 가수부
  • 지수부는 숫자를 정규화하여 나온 2의 n제곱에서 n을 나타내며, n을 2의 보수법으로 표현하여 사용
  • 가수부는 숫자를 정규화하여 나온 1.xxxxx에서 소수 부분을 사용

고정 소수점(Fixed-point)

  • 맨 앞 부호를 나타내는 비트를 제외하고 나머지를 통째로 하나의 수를 나타내는데 사용
  • 여기에서 미리 정해놓은 소수점의 위치로 정수부와 소수부를 구분함

Exercise 01 : Towards a more useful fixed-point number class

과제에서 int형으로 사용하는 fixed_value는 미리 정해놓은 소수점 위치(8)을 참고하여 설정한 비트
예를들어 Fixed의 객체 생성시 생성자로 정수 10을 사용했다면

  • 정수 10에 해당하는 비트는 1010
  • 이를 고정 소수점 위치에 맞도록 8자리 위로 올려서 101000000000의 비트를 가진 수로 저장한 것이 fixed_value
  • 이는 비트 연산자 <<를 사용하여 구현

정수가 아닌 float형 숫자를 생성자로 사용했다면

  • 정수와 마찬가지의 방법을 사용하나, 부동 소수점 수는 지수부와 기수부가 나누어져있기때문에 << 비트 연산을 적용할 수 없음
  • 따라서 해당 숫자에 (1 << fractional_bits)만큼을 곱하는 것으로 대체
  • 이후 비트를 8자리 옮긴것과 동일한 256이 곱해진 부동 소수점 수를 int형으로 형변환
  • 이 때 소수점에 의한 오차를 줄이기 위해 반올림을 해주는 roundf 함수를 사용

저장해놓은 fixed_valueint형이나 float형으로 바꿀때는 정확히 반대로 진행하면 됨


Exercise 02 : Now we’re talking

pre-increment/descrement (전위증감) : 증감되기 전의 값을 반환
post-increment/descrement (후위증감) : 증감된 후의 값을 반환

static 멤버 함수의 경우 객체를 선언하지 않고도 클래스의 네임스페이스만을 통해서 호출 가능
단, 그렇기 때문에 객체를 가리키는 this 포인터는 사용이 불가능함


Exercise 03 : BSP

const 멤버 변수가 있는 경우에는 대입 연산자를 사용할 수 없음에 유의

어떠한 점이 삼각형의 내부에 있는지 판별하는데는 벡터의 외적을 활용
어떠한 점을 P, 삼각형의 세 꼭짓점을 ABC라고 했을 때

  • PA X PC, PC X PB, PB X PA (X는 외적)
  • 위 세 값의 부호가 모두 같은 경우 점 P는 삼각형 ABC의 내부에 위치