본문 바로가기
Development/C|C++|C#

[Effective C++]2. 생성자, 소멸자 및 대입 연산자

by True Life 2016. 10. 16.


생성자, 소멸자 및 대입 연산자



항목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);