[C++] 챕터 5
복사 생성자와의 첫만남
C++ 스타일의 초기화
// C style
int num = 20;
int &ref = num;
// C++ style
int num(20);
int &ref(num);
class SoSimple
{
private :
int num1;
int num2;
public :
SoSimple(int n1, int n2) : num(n1), num2(n2)
{}
void ShowSimpleData()
{
cout<<num1<<endl;
cout<<num2<<endl;
}
};
int main(void)
{
SoSimple sim(15,20);
SoSimple sim2 = sim1;
sim2.ShowSimpleData();
return 0;
}
키워드 explicit
-
SoSimple sim2 = sim1;
->SoSimple sim2(sim1)
-
이러한 묵시적 형변환은 복사 생성자를 explicit 으로 선언하면 막을 수 있다.
깊은 복사와 얕은 복사
디폴트 복사 생성자의 문제점
- 얕은 복사 : 객체 소멸시 문제 발생
Person man2 = man1;
깊은 복사를 위한 복사 생성자의 정의
Person(const Person& copy) : age(copy.age)
{
name=new char[strlen(copy.name)+1];
strcpy(name, copy.name);
}
복사 생성자의 호출 시점
복사 생성자가 호출되는 시점
- 기존에 생성된 객체를 이용해서 새로운 객체를 초기화 하는경우
Person man("Lee dong woo", 29);
Person man2 = man1;
-
Call-by-value 방식의 함수 호출 과정에서 객체를 인자로 전달하는 경우
-
객체를 반환하되, 참조형으로 반환하지 않는경우
SoSimple SimpleFuncObj(SoSimple ob)
{
return ob;
}
int main(void)
{
SoSimple obj;
SimpleFuncObj(obj);
...
}