int num = 20;
int &ref = num;
//도 가능하지만
int num(20);
int &ref(num);
//도 가능하다
위의 두 가지 초기화 방식은 결과적으로 동일하다.
SoSimple sim2 = sim1;
위와 같이 복사생성자를 사용했을경우 sim1과 sim2간의 맴버 대 맴버 복사가 일어난다.
C++의 모든 객체는 생성자의 호출을 동반한다고 했는데 sim2의 생성자 호출에 대해서는 언급한 바가 없다.
SoSimple(SoSimple ©)
{
...
}
SoSimple sim2 = sim1; //은 실은
SoSimple sim2(sim1); 의 형태로 묵시적 변환이 되어서 객체가 생성되는 것이다.
//복사 생성자
SoSimple(const SoSimple ©) //const 를 붙혀 원본을 바뀌지 않게 한다.
: num1(copy.num1), num2(copy.num2)
{
cout << "called SoSimple(SoSimple ©)" << endl;
}
SoSimple sim2 = sim1 //SoSimple sim2(sim1) 으로 변환.
“복사 생성자를 정의하지 않으면, 맴버 대 맴버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다.”
위의 문장이 이야기하듯이 생성자가 존재하더라도, 복사 생성자가 정의되어 있지 않으면 디폴트 복사 생성자라는 것이 삽입되어 맴버 대 맴버의 복사를 진행한다.
SoSimple sim2=sim1; 은 묵시적으로 변환되어 복사 생성자가 호축된다.
따라서 위와 같은 유형의 변환이 마음에 들지 않는다면 explicit 키워드를 사용할 수 있다.
explicit SoSimple(const SoSimple ©)
: num1(copy.num1), num2(copy.num2)
{
//empty
}
더 이상 묵시적 변환이 발생하지 않아서 대입 연산자를 이용한 객체의 생성 및 초기화는 불가능하다