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_value
는private
으로 설정해 클래스 외부에서 접근할 수 없기 때문에getRawBits()
와setRawBits()
함수를 만들어서 사용- 변수에 접근시
const
제한자를 적절하게 사용할 필요가 있음 - 멤버 함수 뒤에
const
를 선언할경우 해당 함수에서 멤버 변수의 값을 변경하지 않음을 의미 - 매개변수에
const
선언시 해당 매개변수의 값을 변경하지 않음을 의미
- 변수에 접근시
CPP02의 과제에서 private
멤버 변수를 외부에서 접근할 일은 없으나, private
멤버 변수에 대해 getter
와 setter
를 관습적으로 사용한다고 함
변수를 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_value
를 int
형이나 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의 내부에 위치
'42Seoul > cpp_module' 카테고리의 다른 글
CPP Module 05 (0) | 2023.02.22 |
---|---|
CPP Module 04 (0) | 2023.02.22 |
CPP Module 03 (0) | 2023.02.22 |
CPP Module 01 (0) | 2023.02.22 |
CPP Module 00 (0) | 2023.02.22 |
댓글