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

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

1. 컴파일러가 자동으로 선언해주는 함수

- 기본 생성자

- 복사 생성자(copy constructor)

- 복사 대입 생성자(copy assignment opertator)

- 소멸자(destructor)

2. 복사 생성자가 하는일은 원본 객체의 비정적 데이터를 사본 객체 쪽에 옮기는 일.

3. 복사 대입 연산자 같은 경우 '적법' 과 '합리적'을 따져 조건에 부합하지 않으면 컴파일러는 기본적으로 생성하지 않는다.

4. 멤버변수가 참조자, 상수로 되어 있다면 '복사 대입 연산자' 가 자동으로 생성되지 않고 컴파일 에러 발생.

    ->  C++의 참조자는 원래 자신이 참조하고 있는 것과 다른 객체를 참조할 수 없기 때문이다.( 에러 발생)

5. private 영역에 대해 '복사 대입 연산자' 를 생성한 경우 접근이 불가능하다. 따라서 해당 경우엔 컴파일러가 암시적 생성 거부를 선언한다(상속클래스라면 private을 protected로 바꾸면됨) 

6. const의 경우에도 상수성인 값을 복사하는 행위자체가 적법하지 않다고 판단해 5번같이  컴파일러가 암시적 생성 거부 선언.

 

생성자 공부

메인함수에서 객체 선언시, 

그냥 선언하면 '기본 생성자' 호출 ex) Test t1;

객체 생성하면서 인자를 넣어주면 '복사 생성자' 호출 ex) Test t2(t1);

객체 생성하면서 같은 타입을 대입 연산한다면 '복사 생성자' 호출 ex) Test t3 = t1;

일반 상황에서 대입 연산을 한다면 '복사 대입 연산자'를 호출 ex) t1 = t2;

Call-by-Value 시, 복사 생성자 사용하여 새로운 객체 생성.

 

 

기억하자!

컴파일러는 모든 경우가 아닌 경우에 따라 "생성자", "소멸자", "복사 생성자", "복사 대입 연산자"를 암시적으로 생성하는 걸 기억하자.

 

댓글을 작성해보세요.