스토리텔링 개발자

[Effective C++] 5. 암시적으로 생성되는 함수 본문

개발/Effective C++

[Effective C++] 5. 암시적으로 생성되는 함수

김디트 2024. 5. 17. 10:34
728x90

항목 5. C++가 은근슬쩍 만들어 호출해버리는 함수들에 촉각을 세우자.

 

 

 

암시적 생성
  • 생성자, 복사 생성자, 복사 대입 연산자, 소멸자
  • 직접 선언하지 않으면 컴파일러가 저절로 선언해준다.
  • 암시적 생성 되는 복사 관련 함수들은 얕은 복사를 한다.

 

 

 

암시적으로 생성된 함수들의 특징
  • 기본 생성, 소멸자
    • 기본 클래스 및 비정적 데이터 멤버의 생성자, 소멸자를 호출해주는 등의 작업을 한다.
    • 즉, 컴파일러에게 “배후의 코드”를 깔 수 있는 자리를 마련해준다.
    • 상속한 기본 클래스의 소멸자가 가상 소멸자가 아니라면 비가상 소멸자로 만들어진다.
  • 복사 생성자, 복사 대입 연산자
    • 원본 객체의 비정적 데이터를 사본 객체 쪽으로 그냥 복사한다.
    • 복사 생성자와 복사 대입 연산자는 근본적으로 동작 원리가 같다.
    • 복사 대입 연산자를 private로 선언한 기본 클래스의 파생 클래스는 암시적 복사 대입 연산자를 가질 수 없다.

 

 

 

복사 대입 연산자가 생성되려면?
  • 컴파일러가 자동으로 만들어주는 최종 결과 코드가 적법하고, 이치에 닿아야 한다.
  • 둘 중 어느 검사도 통과하지 못하면 컴파일러는 operator=의 자동 생성을 거부한다.
class Test{
private:
    int i = 1;
    int& i2 = i;
    const i3 = 3;
};

int main() {
    
    Test t;
    Test t2;
    t = t2; // i2, i3로 인해 실패
    // 클래스 내 비정적 상수 혹은 참조자를 포함하는 객체에 대해
    // 복사 대입 연산자를 암시적으로 사용하려고 할 때,
    // 해당 값들은 수정할 수 없으므로 컴파일이 거부된다.

    return 0;
}
728x90
Comments