Effective C++/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