cpp 02

jiwoo·2022년 12월 22일
0

cpp

목록 보기
3/9

CPP 02

생성일: 2022년 11월 29일 오후 11:08
최종 편집 일시: 2022년 12월 6일 오후 9:17
태그: cpp
cpp notion

CPP MODULE 02

  • Ad-hoc polymorphism, operator overloading and Orthodox Canonical class form
  • 임시 다형성(함수 오버로딩), 연산자 오버로딩, 정식 클래스 형식

Orthodox Canonical class form

정식 클래스 형식

  • Default constructor 디폴트 생성자
  • Copy constructor 복사 생성자
  • Destructor 소멸자
  • Copy assignment operator 대입 연산자 오버로딩

https://www.francescmm.com/orthodox-canonical-class-form/

  • default constructor 디폴트 생성자
    • 인수를 취하지 않는 생성자이다
    • 아무 생성자도 없을 경우에 컴파일러가 자동으로 정의하지만 pdf에서 정식 클래스형식으로 작성할 것을 요구하였으니 빼먹지 말자
    • Fixed( void );
    • Fixed::Fixed( void ){ ... }
  • copy constructor 복사생성자
    • 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조로 자신을 초기화 하는 생성자이다.
    • 복사 생성자를 이용한 대입은 깊은 복사(deep copy)를 통한 값의 복사를 한다. 그렇기 때문에 새롭게 생성되는 객체는 원본과 동일하면서도, 완전한 독립성을 가진다
      • 깊은 복사 (deep copy)?
        • 대입연산자(=) 을 이용한 객체의 대입은 얕은 복사(shallow copy)로 이루어진다. 객체의 값 자체가 아닌, 객체를 가리키는 포인터인 주소를 복사한다. 그렇기 때문에 객체의 맴버가 힙(heap)공간을 참조할 경우 얕은 복사를 한다면 문제가 발생할 수 있다.
        • 깊은 복사는 포인터가 아닌 완전한 값을 복사 해준다.
    • 사용 되는 상황
      • 객체가 함수의 인수로 전달될 때
      • 함수가 객체의 반환값으로 반환할 때
      • 새로운 객체를 같은 클래스 타입의 기존 객체와 똑같이 초기화 할 때
    • Fixed::Fixed(const Fixed &fixed){ ... }
    • Fixed fix_copy = Fixed::Fixed(fix_origin);
    • http://www.tcpschool.com/cpp/cpp_conDestructor_copyConstructor
  • Destructor 소멸자
    • 그렇다 그 소멸자이다. 별다른 것은 없다. 아마도
  • Copy assignment operator 대입 연산자 오버로딩
    • 리턴값은 참조형으로
    • 정의해서 쓰는 이유는 깊은 복사를 하기 위해서 !
    • Fixed &Fixed::operator=(const Fixed &fixed)

연산자 오버로딩

  • 연산자를 재정의하여 해당 클래스로 사용 하는 것.
  • 반환형 operator 연산자(가인수 리스트)
  • 멤버함수에 의한 오버로딩

오버로딩 vs 오버라이딩

오버로딩 overloading : 매개변수의 타입이나 개수가 다른 함수 중복 정의

오버라이딩 overriding : 상속과 다형성에서 사용되며 자식클래스가 부모클래스로부터 상속받은 함수에 재정의 하는것.


ex00 My First Class in Orthodox Canonical Form

orthodox canonical form 에 맞추어 class를 만들어보자.

float 와 int 사이의 변환을 해결한 부동소수점 클래스 기반 만들기

  • 고정소수점

  • 부동소수점

    • 뜰 부, 움직일 동, 떠다니는 움직이는 소수점
      http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber

    • 제한된 자릿수로 인해 표현 범위가 작은 고정 소수점에 비해 부동 소수점은 매우 큰 실수 까지 표현할 수 있다.

    • 하지만 오차또한 존재한다는 단점도 있다. 10진수를 정확하게 표현하지 못하고 근사치를 표현한다.

    • 263.3 = 0 / 10000111 / 00000111010011001100110

    • 10000111 (127 + 8 = 135)

    • 00000111 / 010011001100110 (0.29998779296875,, 0.3의 근사치)

    • https://steemit.com/kr/@modolee/floating-point 부동소수점

    • E 지수 표기법

      • 10만은 1*10의 5승 = 1.0e+05
      • 1억 (100,000,000) 10의 8승 = 1.0e+8
      • 3.14E-16 = 0.000000000000000314
    • https://seulcode.tistory.com/461 E 지수 표기법

  • 복사생성자, 대입연산자 오버로딩

    • 복사생성자는 인자로 복사할 대상을 받고 복사하여 생성한다.
    • 대입연산자는 인자를 값을 복사해서 대입한다.
  
    1.	Fixed a;
    2.	Fixed b( a );
    3.	Fixed c;
    
    4.	c = b;
    
    /*
    1. Default constructor called
    
    2.
    복사생성자 안에서 오버로딩된 대입연산자 사용
    Copy constructor called
    Copy assaignment operator called
    getRawBits memeber function called
    
    3.
    Default constructor called
    
    4.
    Copy assaignment operator called
    getRawBits memeber function called
    */

**ex01 Towards a more useful fixed-point number class**

float 와 int 사이의 변환을 부동소수점 클래스를 만들어서 해결하자.

  • 허용함수 float roundf(float x);

    • <cmath>
    • float x를 반올림하여 반환한다.
  • const static int fraction = 8

    • 부동소수점 기준이다.
  • Fixed::Fixed( const int num )

    • this->fixed_point = num << fraction;
    • num << fraction == num * 256
  • Fixed::Fixed( const float num )

    • this->fixed_point = roundf(num * (1 << 8));
    • num (1 << 8) == num 256 (실수형은 비트연산이 불가하기 때문에 직접적으로 256을 곱한다)
    • roundf()는 반올림을 해주는 함수로 float를 고정소수점으로 변환시 미쳐 변환되지 못하는 끝자리의 수들을 반올림해주는 역할을 한다.
  • float Fixed::toFloat( void ) const{... }

    • 부동소수점을 float으로 변환한다.
  • int toInt( void ) const{ ... }

    • 부동소수점을 int로 변환한다.
  • 42.42f 과정

    • 0 10000100 01010011010111000010100
    • 42.42f * 256 ⇒ 10859.52
    • roundf(10859.52) 반올림 ⇒ 10860 이 저장됨 (int형으로 계산했을때.. )
    • 10860(int)
    • **00101010 01101100(bit) 부동소수점 42.421875**
    • https://www.h-schmidt.net/FloatConverter/IEEE754.html
  • std::ostream &operator<<(std::ostream &**os**, const Fixed &**fixed**){ ... }

    • std::cout << fixed.toInt() << std::endl;
    • insertion («) operator overloading
    • 입출력 연산자 오버로딩
      • ostream : 출력 수행 클래스
      • ostream 내부에 여러 기본?자료형들의 연산자 오버로딩이 되어있기 때문에 이를 이용하여 클래스의 입출력 연산자 오버로딩을 만들어 준다.
  • rvalue lvalue

    • a = Fixed( 1234.4321f );

    • a = 에는 대입연사자 오버로딩으로 Fixed( 1234.4321f) 가 반환하는 참조Fixed클래스가 반환하는 값을 복사해 저장한다.

    • Fixed( 1234.4321f) 가 반환하는 참조Fixed클래스는 rvalue로 실행이 끝나면 사라진다

      Float constructor called
      Copy assaignment operator called
      Destructor called
    • r-value : 메모리 위치와 식별자를 특정할수 없는 데이터. (보통 오른쪽에 위치)

    • l-value : 메모리 위치를 참조하는 식 .

    • https://learn.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170

    • https://assortrock.com/236 c++11 이전과 이후

ex02 Now we’re talking

멤버함수로 연산자 오버로딩 추가하기 + 정적맴버함수 min, max 작성

  • 산술, 비교, 대입 연산자 오버로딩 https://modoocode.com/202
  • 사칙연산에서는 반드시 값을 리턴해주어야 한다.
    • ex ) a = b + c + b;
      • a = b x 2 + c 의 값을 기대한다.
      • 참조로 넘겨주게 된다면 (b.plus(c)).plus(b)
      • b 에 b + c 가 들어가기 때문에 후에 두번째 b를 더할때 (b+c) + (b+c) 가 되어 버리는 문제가 발생한다.
  • 증감연산자 https://modoocode.com/203
    • 전위 증감 연산자 오버로딩 Fixed &operator++( void ); Fixed &operator--( void );
      • call by reference
    • 후위 증감 연산자 오버로딩 const Fixed operator++( int ); const Fixed operator--( int );
      • call by value

      • C++의 연산특성이 후위증가의 연속된 표현식을 배제하기 때문에 오버로딩하는 함수 또한 배제하는 것이다.

      • 후위 연산자는 실행 다음행(세미콜론 후)에서 바뀌도록 정의하기 때문에 const를 붙여주어야 한다.

        https://noel-embedded.tistory.com/874

        https://sexycoder.tistory.com/11

  • min, max

    • 정적 멤버함수
      • 객체를 생성하지 않고 클래스 이름만으로 호출 가능하다.
      • 객체를 생성하지 않으므로, this 포인터를 가지지 않는다.
      • 특정 객체와 결합하지 않으므로, 정적 멤버 변수밖에 사용 불가하다. (주인객체?가 없으니 다른 변수는 사용 불가하다는 말인 것 같다)
      • http://www.tcpschool.com/cpp/cpp_encapsulation_staticConst
  • const

ex03 BSP

bsp stands for Binary space partitioning

  • const_cast • const_cast<new_type>(expression) • const_cast<바꿀타입>(대상) 포인터 또는 참조형의 상수성(const)를 잠깐 제거해주는데 사용한다. volatile키워드도 잠깐 제거해주는데 상요한다. 형변환은 불가능하다. 함수포인터도 불가능하다고 한다. https://blockdmask.tistory.com/240
  • 다각형 내부 외부 판별
    • B점의 반직선이 다각형과 만나는 점의 개수가 홀수개이면 내부의 점, 짝수개이면 외부의 점****이다.
    1. 점B의 y좌표가 두 선분 꼭지점의 y좌표 사이에 있다.
    2. 점B를 지나는 수평선과 선분 사이의 교점의 x좌표가 점B의 x좌표보다 크다
    • 조건 1을 만족하면 점B를 지나는 수평 직선과 선분 사이에 반드시 교점이 존재한다. 이 때 오른쪽 반직선과 교점만 세야하므로 조건2를 추가로 만족해야 반직선과 선분 사이의 교점 존재여부를 올바르게 판별할 수 있다.

http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber

  • 직선의 교점
    Fixed	f1 = line1.getX() - line2.getX();
    Fixed	f2 = point.getY() - line2.getY();
    Fixed	f3 = line1.getY() - line2.getY();
    Fixed	fx = f1 * f2 / f3 + line2.getX();
    if (point.getX() < fx)
    		return true;
        

https://sncap.tistory.com/910

  • 그래픽 계산기

https://www.geogebra.org/graphing?lang=ko

0개의 댓글