전체 글
-
항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 변경금지@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 25. 23:56
동적타입이란 이 객체가 어떻게 동작할 것이냐를 가리키는 타입이 동적 타입이다. 기본 클래스 *ptr1 기본 클래스 *ptr2=new 파생클래스 1 기본 클래스 *ptr3=new 파생클래스 2 ptr2의 동적 타입은 파생클래스 1 ptr3의 동적 타입은 파생클래스 2 ptr1의 경우에는 동적 타입이 없다. 동적 타입은 프로그램이 실행되는 도중에 바뀔 수 있다. 근데 위에서 ptr1,ptr2,ptr3은 기본클래스에 대한 포인터로 선언되어 있기 때문에 각각의 정적 타입도 모두 기본클래스 타입이다. 가상함수는 동적으로 바인딩된다. 이 뜻은 가상함수의 호출이 일어난 객체의 동적 타입에 따라 어떤 함수가 호출될지를 결정된다는 뜼.. 근데 기본 매개변수 값이 설정된 가상함수에서 가상함수는 동적이지만 기본매개변수는 정..
-
항목 36 : 상속받은 비가상 함수를 파생클래스에서 재정의하지말것@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 25. 23:27
왜냐면 비가상 함수는 가려지기 때문이다. 예를 들어 기본클래스 *ptr=new 파생클래스 일 경우... ptr은 기본클래스에 대한 포인터 타입으로 선언되었기 때문에 ptr을 통해 호출되는 비가상 함수는 항상 기본클래스에 정의되어 있을 것이라고 결정해 버린다. 심지어 기본클래스에서 파생된 파생클래스 객체를 가리키고 있다 해도 마찬가지다. (가상함수와 반대로 객체를 가리키는 포인터 타입에 따라 좌우된다.. 가상함수는 실제 객체죠?? ㅎ)
-
항목 35 : 가상 함수 대신 쓸 것들도 생각해 두는 자세를 ..@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 25. 14:49
비가상 함수 인터페이스(NVI 관용구) 가상 함수의 랩퍼라고들 함. class A { private: virtual int dohelath() const //가상함수를 private로 설정하고 { int num=3; return num; } public: int health() const //가상함수를 랩퍼하는 함수 { //전에 할일을 넣을 수 있고 int val=dohelath(); //가상함수를 호출한다. //dohealth()가 끝난 뒤에 할일을 넣을 수 있다. return val; } }; class B : public A { public: void showhealth() { cout
-
항목 10 : 대입 연산자는 *this의 참조자를 반환한다@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 15. 22:15
x=(y=(z=15)); 이렇게 대입연산이 사슬처럼 엮이려면 대입 연산자가 좌변 인자에 대한 참조자를 반환하도록 구현되어야 한다. 즉 z=15에서 z가 참조 반환되어 y=에 들어가고 y가 참조반환되어 x=에 들어간다. 즉 return *this; operator= operator+= 특히 operator=에서는 자기대입에 대한 처리가 빠지지 않도록 한다. class B { public: int num; B() { num=0; } }; class A { public: B *num; public: A() { num=new B; } ~A(){} //첫번째 방법 일치성 검사 A& operator=(const A& rhs) { if(this==&rhs) { return *this; } delete num; num..
-
항목 7:가상 소멸자@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 14. 23:20
가상 소멸자를 하는 이유는 어떤 함수(파생클래스를 반환하는데 반환인수는 기본클래스) 가 반환하는 포인터가 파생클래스 객체애 대한 포인터라는 점과 이 포인터가 가리키는 객체가 삭제될때 기본 클래스 포인터를 통해 삭제된다는 점 A B : public A 일때 A* return() 일 경우.. A부분은 저 세상(delete)되는데 B부분은 남아 있다 .. 가상함수를 하나라도 가진 클래스는 가상 소멸자를 가져야한다. 가상 함수가 들어가게 되면 객체 크기가 커진다. 어떤 객체에 대해 어떤 가상함수가 호출되려고 하면 호출되는 실제 함수는 그 객체의 vptr(가상함수 테이블 포인터)가 가리키는 vtbl(가상 함수 테이블)에 따라 결정된다 vtbl에 있는 함수 포인터들 중 적절한 것이 연결되는 것. 순수가상소멸자 A클..
-
항목6 : 복사생성자 및 대입연산자 제한@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 14. 22:42
기존의 private 상태로 복사생성자(const 복사생성자&); 대입연산자& operator=(const 대입연산자&); 였던 방법말고도.. 상속을 활용하면서 class A { protected: A(){} ~A(){} private: A(const A&); //복사 생성자 A& operator=(const A&); //대입연산자 }; class B : private A { public: B(){} int num; }; 이런식으로 활용한다..
-
보간법@ 16. 1 ~ 17. 1/게임프로그래밍의 정석 2015. 1. 6. 16:17
1차원 보간법 P = A + u(B-A) P = uB + (1-u)A를 풀면 위와 같다. u의 범위는 0~1사이이며 u가 0이라면 P=A가 되고 u가 1이라면 P=B가 된다. 예를 들어 a가 서울이고 b가 부산이라면 (b-a)는 서울에서 부산으로 가는 길을 나타내고 u가 1이면 전체를 달렸으니 p는 부산이 되고 u가 0이면 출발전이니 p는 서울이 된다. u가 0.7이면 길에서 70%를 달렸으니 p는 동대구쯤이다. 2차원 보간법 1차원에서는 u가 하나뿐이니 2차원에서는 2개를 사용한다 그래서 v가 늘어남 그리고 점도 A B에서 C가 하나 더 추가됨 P = A + u(B-A) + v(C-A) 책에서 그렇다 하더라..