#220829~

12-5. 바인딩(binding)

  • 변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야하는 명령어들이 결정되는 시점
    • static(정적), early binding: 컴파일시 변수의 위치와 함수가 실행할 명령이 결정되는 경우
      • static변수, overloading (함수중첩)
    • dynamic(동적), late binding: 실제 실행할 때(runtime) 결정되는 경우
      • 지역변수, overriding
void sub();
int main() {
  std::cout << "start\n" << std::endl;
  sub();
  sub();
  sub();
  return 0;
}
void sub()
{
  int x=10;
  //동적 바인딩  runtime시 
  static int y=10; 
  //정적 바인딩, y의 초기값은 컴파일시 10으로 정해지며 실행시에 이 선언문은 실행되지 않음
  std::cout << x << "," << y << '\n' << std::endl;
  x++;
  y++;
  }
//1010,1011,1012

12-6. 동적바인딩(지역변수)과 정적바인딩(static변수)

12-7. C와 C++에서의 auto는 다르다

12-8. static 멤버변수

  • 마우스가 눌린 좌표 저장하는 Point 클래스 구현 (좌표값 지정위해 x,y선언)
    • 눌린 횟수 저장하는 '정적 멤버변수 count 선언' - 클래스 밖에서 초기화를 함! 정의 꼭 해주기! (초기값이 없으면 0)

12-9. cast 연산자: C vs C++

casting (int -> char로! 등등)
자식 -> 부모로 가는 Up은 문제없고 down은 문제가 있을 수도 있음
이것이 down_casting임

12-10. 가상함수(virtual, overriding)

  • 기본(부모)클래스 멤버함수 앞에 'virtual'이라는 키워드를 씀

class A 
{
    public:
    virtual int SS(int i) {return (i * 2);}
    // 자식아 이 함수가 마음에 들지 않으면 재정의해. 그럼 이 함수는 무시될꺼야 
    // 그래도 함수명, 리턴형, 매개변수의 개수와 자료형은 같아해/ 기능만 다르게 해
};

class B : public A
{
    public:
    int SS(int i) {return(i * 3);}
    // 부모클래스의 SS함수가 맘에 안들어서 재정의
}
  • virtual 함수 예제
class A 
{
public:
    // 'virtual' !!!!!!!!!!!!!!!
    virtual int SS(int i) {return(i * 2);}
    // 바로 위 SS함수를 호출하도록 '컴파일시' 지정됨 (static binding)
    int dd(int i) {return(SS(i)*2);}
};

class B : public A
{
public:
    int SS(int i) {return(i * 3);}          // B에도 dd 와있음

};

int main()
{
    B bb;
    //부모, 자식 포인터 잘 확인하기
    A *pA=new A;            // only 부모 포인터
    A *pB=new B;            // 자식의 주소를 부모클래스가 가지고있음  
    std::cout << bb.dd(2) << std::endl;     // (i*3)*2 =12
    std::cout << pA->dd(2) << std::endl;    // 8 (부모, 부모)
    std::cout << pB->dd(2) << std::endl;    // (i*3)*2 = 12
    delete pA; delete pB;                   // new로 할당했을때는 delete로 꼭 삭제
    return 0;
}

12-11. 순수가상함수(pure virtual function)

  • 순수 가상함수 (굳이 자기가 없어도 되지만 있음)
    • vitual double area()=0;
    • 어떤주소를 넣느냐에 따라 함수 구현이 달라질 수있음
       // 코드 상단에
       public: vitual double area()=0; 
       
       Rectangle(double h, double w)
        {
        	height=h; width=w;
        }
        double area() {return(width * height);}
        
    	Triangle(double h, double w)
        {
        	height=h; width=w;
        }
        double area() {return(width * height /2.0);}
        
        // 추상클래스는 객체를 만들 수없지만 포인터 객체는 가능! 
        shape* p;					//포인터 객체는 가능
        Rectangle nemo (10.0, 20.0)
        Triangle semo (10.0, 20.0)
        
        
        p = &nemo //자식의 주소를 부모 포인터에 대입
        std::cout << "네모면적" << p->area() << std::endl; 
        p = &semo
        std::cout << "세모면적" << p->area() << std::endl;

12-12. virtual의 의미

  • virtual이 있을 때 없을 때 자식클래스 함수가 호출되는지 안되는지
profile
Hakuna Matata

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN