Fixed a;
Fixed b(a); --> 복사생성자
Fixed c;
c = b; --> 대입연산자 오버로딩
/* 복사생성자 */
Fixed::Fixed(const Fixed &fixed)
{
std::cout << "Copy constructor called" << std::endl;
this->fixed_point_value = fixed.fixed_point_value;
}
/* 대입연산자 오버로딩 */
Fixed & Fixed::operator=(const Fixed &fixed)
{
std::cout << "Copy assignment operator called" << std::endl;
this->fixed_point_value = fixed.fixed_point_value;
return *this;
}
얕은 복사
만을 사용한다는 것.깊은 복사
를 사용해야만 나중에 소멸자 호출 시 메모리가 이중해제되는 문제를 막을 수 있다. https://www.geeksforgeeks.org/copy-constructor-in-cpp/std::ostream& operator<<( std::ostream &os, const Fixed &fixed );
>>
<<
입출력 연산자 오버로딩은 멤버 함수로는 구현할 수 없고 전역 함수로만 구현할 수 있다.<<
오버로딩을 멤버 함수로 구현하려면 ostream 타입의 객체이자 왼쪽 피연산자인 std::cout이 호출하여야 한다.operator++( void );
operator--( void );
꼴로, 후위 증감 연산자는 operator++( int );
operator--( int );
꼴로 나누어 구분한다. 후위 증감 연산자의 매개변수는 사용할 일은 없다. 단순히 구분을 위해 추가해 준 것.bool operator>( Fixed &fixed ) const;
const Fixed &max( const Fixed &a, const Fixed &b);
글쓴이: ixevexi / 작성시간: 금, 2006/06/16 - 12:13오후
이 const값에 대해서 아주 잘 정리된 글이 여기 bbs에 있는데
어딨는지 찾질 못하겠네요거기 내용을 간추리자면
- const 리턴값은 아무런 의미가 없다
- const 리턴값이 의미가 있는 경우는 단 한가지 레퍼런스로 리턴하는 경우이다
우선 int func();이란 함수가 있을때
const가 붙어있지 않더라도
리턴값은 r-value이기 때문에 수정이 불가능합니다.
다시 풀어서 설명하면++func();
이라는 구문은 문법적으로 const int를 반환하지 않더라도
r-value를 수정하려고 했기때문에 오류가 납니다.
그러므로 const return값은 레퍼런스 리턴이 아닌 이상 전혀 쓸때가 없습니다.혹 틀린게 있다면 ^^ 고수님들이 수정해 주시겠죠??
PS 생각해보니 레퍼런스뿐이 아닌 const형 포인터를 리턴할때도 필요하긴 하겠네요 ^^
#include <iostream>
int main( void ) {
Fixed a;
Fixed const b( Fixed( 5.05f ) * Fixed( 2 ) );
std::cout << a << std::endl;
std::cout << ++a << std::endl;
std::cout << a << std::endl;
std::cout << a++ << std::endl;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << Fixed::max( a, b ) << std::endl;
return 0;
}
Default constructor called // Fixed a;
Float constructor called // Fixed( 5.05f );
Int constructor called // Fixed( 2 )
Float constructor called // Fixed const b;
Destructor called // Fixed( 5. 05f ) 의 소멸자
Destructor called // Fixed( 2 ) 의 소멸자
0 // 기본소멸자로 생성된 a. 0으로 초기화 했던 값이 나옴
0.00390625 // ++a라고 1이 아니라 fixed_point_value를 ++하는 거기 때문에
// (1 / 2^8)한 값이 float형태로 출력되는 것.
0.00390625
Copy constructor called // 후위 증감 연산자에서는 복사 생성자가 호출됨
0.00390625 // 후위 증감 연산자이기 때문에 연산이 일어나기 전의 값이 리턴
Destructor called // 복사 생성자의 소멸자
0.0078125
10.1016
10.1016
Destructor called // b의 소멸자
Destructor called // a의 소멸자
Point::Point()
: x(Fixed(0)), y(Fixed(0))
{
}
BSP에 대한 개요: https://ko.wikipedia.org/wiki/%EC%9D%B4%EC%A7%84_%EA%B3%B5%EA%B0%84_%EB%B6%84%ED%95%A0%EB%B2%95
How to determine if a point is in a 2D triangle?: https://stackoverflow.com/questions/2049582/how-to-determine-if-a-point-is-in-a-2d-triangle -> 대충 어떻게 사용하는진 알겠는데 완벽히 이해는 안 됨..
ㅇㅎ 그니까 sign 함수에서 하는 역할이 p1이 p2,p3을 잇는 선분으로 나뉘는 두 평면 중 어디에 위치하는 지를 판단하는 듯.
그러니 check_point를 기준으로 (check, p1, p2), (check, p2, p3), (check, p3, p1) 각각을 비교해서 check할 점이 삼각형의 세 변을 기준으로 나뉘는 이분 평면 중 어느 쪽에 위치하는지로 결정 되는 것
Direction of a Point from a Line Segment https://www.geeksforgeeks.org/direction-point-line-segment/
ㅇㅎ 한 점을 0,0으로 맞추고 외적을 구해주는 것
a, b -> b, c -> c, a 순으로 가니까 부호가 다 같아야 하는 거였음
더 읽어보면 좋을 자료: https://iq.opengenus.org/binary-space-partitioning/