생성자, 소멸자 및 대입 연산자
항목5. 컴파일러산 함수들에 대한 주의
- 복사 생성자. 기본 생성자. 복사 대입 연산자
* 복사 생성자/대입연산자 → 비정적(non static) 멤버 복사
* 기본생성자 → 다른 생성자를 임의로 만든 경우 컴파일러가 만들지 않음
- 참조자 or 상수데이터멤버의 경우 복사 생성자/대입연산자 사용 불가
항목6. 컴파일러산 함수가 필요X → 제거법
1. private로 복사 생성자/대입연산자 생성(cf.friend) & 정의 없이 선언만
2. uncopyable 객체를 상속 (from boost lib) → 컴파일 에러
항목7. 다형성을 가질 기본 클래스는 소멸자를 가상 소멸자로 선언.
- ex, 기본클래스 → polyA, B, C : 기본클래스의 ptr 반환 → ptr delete! → 기본클래스 부분 소멸
*가상소멸자로 해결 *팩토리 함수
- 가상함수 선언시 vtbl(Virtual table) 용량이 하나 추가됨.
* 64bit(int*2) → 96bit(int*2 + VTBL) → 가상소멸자는 클래스내 가상 function 있을때만 사용
- C와의 호환성↓
- ex, string 상속시 string ptr 전환 후 소멸과 같은 미벙의 동작 주의
*가상소멸자가 없음
- 순수가상소멸자 : 추상클래스로 만들고 싶은데 가상 메서드를 마땅히 둘 게 없을때 적합
항목8. 소멸자에서 예외 처리 (throw 방지법)
- 소멸자에서 예외 발생시 다른 객체들 소멸이 어려움 → abort or try-catch 삼키기
- 예외가 발생할 가능성이 있는 함수는 소멸자가 아닌 일반함수로서 사용자에게 넘겨야 함
* 사용자가 커버 (책임전가)
항목9. 생성/소멸 중 가상함수 금지!
- 기본클래스 생성자 → 가상함수 호출 → 파생클래스의 미정의 동작 '방지' → 기본클래스처럼 동작
* 파생클래스 생성 전이므로 없는것 처럼 동작
- 가상함수가 순수가상함수 일 경우 경고 or 오류
- 비가상함수서 가상함수(순수) 호출시 → 기본클래스 본문 or abort
* 해결방법: 파생클래스 생성자서 멤버초기화 리스트 → parameter로 기본클래스 생성자
Derived(const char* _Message) : Base(_Message) { cout<<"Derived 생성자 호출"<<endl; }
항목10. 대입연산자의 반환도 *this.
- 우측 연관 특성을 살리기 위함. x=y=z=15; (+=, -=, *=, /= 도 해당)
항목11. operator=에 대한 자기대입
- 본인 데이터 delete 후 새 데이터 저장시 두개가 동일한 참조시 불상사
→ 1. 동일성 검사 cf. pb = new Bitmap(*rhs.pb)서 에러
→ 2. 원본 저장 후 교체 & 원본 삭제
→ 3. copy & swap (별도사본 要)
* 수동사본 or parameter's Call by value
항목12. 객체 복사 함수(복사 생성자/대입연산자)시 빠짐없이!
- 새로 추가되는 멤버들에 대해서도 갱신.
- 파생클래스에서는 기본클래스 복사 함수 호출 (멤버초기화리스트 & operator=)
* priority Customer → Customer::operator(rhs);
'Development > C|C++|C#' 카테고리의 다른 글
[Effective C++]3. 자원 관리 (0) | 2016.10.19 |
---|---|
[C++]JSON 데이터 트리(Tree)스키마 파싱 논문 구현 (0) | 2016.10.19 |
[Effective C++]1. C++에 왔으면 C++의 법을 따릅시다. (0) | 2016.10.14 |
[QT 5.7]QFileDialog 한글 깨짐 현상 (0) | 2016.10.12 |
[C++]static_cast와 C 스타일 캐스트의 차이 (1) | 2016.09.27 |