C++
-
STL Container 선택C++ 2014. 2. 17. 07:58
표준 STL은 기본적으로 Homogeneous Collection만을 지원한다. 즉 같은 타입의 Object만을 저장할 수 있다. 일단 크기를 예상할 수 있다면 array 가 가장 좋다. 객체를 Access time이나 객체의 추가 삭제가 쉽고 가장 빠르다. 그러나 array를 사용하기 어려운 경우에 적당한 STL container를 찾아보자. Containment ClassContainer Type Insert/DeleteAccessVectorSequencialDynamic Array 데이타 억세스가 많고 데이타의 추가가 뒤에서 일어날때O(1) 임의지점 O(N-p)O(1)ListSequencialBinary Linked List 데이타의 추가 삭제가 빈번하고 접근하는 일이 적을 때O(1)O(N) or ..
-
Inheritance 에서 copy operator & assignment operatorC++ 2014. 2. 15. 07:17
Class에서 pointer를 사용하여 Heap Memory를 동적으로 할당하는 경우copy operator를 반드시 정의 해주어야 한다. 마찬가지로 Assignment Operator 사용도 마찬가지로 꼭 정의를해주는 것이 좋다. 이런 문제는 부모 자식의 상속관계에서도 반드시 고려해주어야 하는 것이 있다. 자식 class에서 Copy Operator를 정의하는 경우에는 반드시 부모 Class의Copy Operator도 정의를 하고 호출을 해주어야 한다. 자식 class에서Assignment Operator를 정의하는 경우에는 반드시 부모 Class의Assignment Operator도 정의를 하고 호출을해주어야 한다 Class Super { Super(); Super(const Super& inSupe..
-
Up-casting and Object SlicingC++ 2014. 2. 14. 07:39
Up-casting은 Polymorphism에서 상위 클래스 타이프로 하위클래스의 객체를 복사할 때 발생을 한다. 이 때 생성되는 객체는 기본적으로 하위 클래스의 멤버를 완전히 잃어 버리고 상위 클래스의 멤버만을 갖게 된다. 좀 더 깊이 생각을 해보면 1)의 예에서는 상위클래스의 default Assignment Operator가 호출이 되어 이미 생성된 하위 클래스의 객체를 복사를 하는 데 상위클래스의 클래스의 멤버만이 복사가 된다. 따라서 멤버함수가 Virtual 이 선언이 되어 있어도 더 이상 찾아볼 하위 멤버함수가 없다. 따라서 상위 멤버 함수가 수행이 된다. 이것이 Slicing이다. 2)의 예에서 보면 ref는 이미 생성이 된 하위 클래스의 객체의 참조값만을 상위 클래스의 default Ass..
-
Polymophism의 사용C++ 2014. 2. 14. 03:48
Polymophism을 이해하는 여러가지 개념 중에 잘 언급이 안 되는 부분이 객체의 형변환으로 이해를 하는 것이 가장 적합하지 않을까한다. 따라서 Polymophism을 사용할 때는 다음 두가지 방법을 사용하는 대 객체 생성 (Heap) 부모의 Class로 자식의 객체를 생성하는 방법은 불가능하다. 가능한 벙법은 자식의 객체를 Heap에 생성을 하고 부모의 class로 pointer를 사용하는 방식이다. 따라서 반드시 이런 코드가 된다. First *pf2 = new Second(); pf2->print(); delete pf2; 이 코드에서도 Overriding 의 규칙은 그대로 적용이 된다. 참조를 사용 Second pf2; First& ref=pf2; Ref.print();
-
Overriding과 VirtualC++ 2014. 2. 14. 01:56
Overriding을 사용하는 목적은 자식 클래스에서 부모 클래스의 멤버나 함수를 재정의해서 쓰는 것이다. 기본적인 문법적 사용방법은Overriding되는 함수에 부모, 자식 모두에게 항상 Virtual을 사용하라는 것이다. 이렇게 사용하면 생성된 객체의 멤버함수가 언제나 호출이 된다. 혼란이 발생하는 경우는 다형성이 사용되는 경우인데 First* pf2 = new Second(); pf2->print(); // Virtual의 특성에 의해 자식의 함수가 호출 delete pf2; 호출이 되는 순서를 보면 print() 가 호출이 되면 먼저 pf2의 포인터가 가르키는 부모의 print()를 찾고 virtual이 선언되었으므로 child로 내려가서 print()를 수행한다.만일 Virtual 이 선언되지 ..
-
Inheritance에서 virtual destructorC++ 2014. 2. 14. 01:12
Inheritance가 있는 Class를 정의할때는 destructor에 습관적으로 virtual을 부모, 자식에 붙인다. 1) First* pf1 = new First(); pf1->firstPrint(); delete pf1; Second* ps1 = new Second(); ps1->secondPrint(); delete ps1; 2) First* pf2 = new Second(); // polymophism pf2->firstPrint(); delete pf2; First default constructor First print First destructor First default constructor Seconds default constructor Second print Second dest..
-
Copy Constructor vs Assignment operatorC++ 2014. 2. 12. 23:22
유사해 보이지만 의외로 이를 구분하는 방법은 쉽다. 하나는 constructor 이고 Asssignment는 operator이다. 즉 Copy는 객체가 없는 상태에서 새로 객체가 생성이 되는 것이고 Assignment는 이미 있는 객체에 다른 객체의 무엇을 복사해주는 것이다. class First { private: int ma; public: First(void); First(int x); ~First(void); First& operator = (const First& rhs); const int getA() ; }; class Second : public First { private: int mb; public: Second(void); Second(int i); const int getB(); ~..
-
Constructor 와 메모리C++ 2014. 2. 12. 01:41
Constructor는 Heap과 Stack 두 가지 메모리에 생성이 가능하다. Stack 에 생성이 되는 경우 Constructor를 Variable 선언하는 방법으로 생성을 하는 방법 객체가 생성이 될 때 Stack 에 생성이 될 때는 객체가 소멸할 때 다른 변수와 함께 소멸이 되므로 delete 할 필요가 없다. Object obj(3); Object obj2; // ******* 주의할 점 Object obj(); 컴파일도 되서 문제없이 보이지만 이건 객체 생성이 구분이 아니라 obj() 라는 function을 부르는 구문이다. Heap에 생성이 되는 경우 New를 사용하여 동적으로 객체를 생성하는 방법 Object obj = new Object(); Object obj2 = new Object(..