2011. 5. 24. 11:28ㆍC++
[C++] - 4
1. 초기화 방식
int val = 20; // c 스타일 방식 초기화
AAA a1 = 10; // c++ 에서는 묵시적으로 AAA a1(10); 으로 변환되기때문에 동일하다.
int val(20); // c++ 에서는 묵시적으로 int val=20; 으로 변환되개때문에 동일하다.
AAA a1(10); // c 스타일 방식 초기화
ex>
Person p2 = p1; // 이의미는 Person p2(Person p1) 로 자동변환된다는것을 말한다.
즉, 이 코드가 실행되려면
Person(const Person& p1) 생성자가 존재해야 이상없이 구동된다.
<이가 선언되어 있지 않으면 컴파일은 이상없으나 런타임시 에러가 발생된다.>
2. 복사생성자
오버로딩을 통한 생성자가 여러개가 존재
* 디폴트 복사 생성자의 문제점: 얕은 복사에 의한 메모리 참조 오류가 발생 할수 있다.
class AAA{
AAA() {}
AAA(int a){}
AAA(const AAA& a){}
}
private: char* name;
Person(char* name) {
name = new char(strlen(name)+1);
strcpy(this->name,name);
}
~Person(){
delete []name;
}
}
/**
이코드는 자동으로 Person p2(Person)으로 변환된다.
해당 생성자가 없으면 자동으로 디폴트 복사 생성자가 생성되나, 문제점이 있습니다.
바로 얕은 복사가 일어나 메모리 참조 오류가 나올 수 있다는 것입니다.
value값이 복사되지 않은채 p2의 name이 p1의 name 포인터의 value를 가리키게 되어
소멸자가 호출될때 문제가 생기는 것입니다.
따라서 메모리 오류가 안나오게 할려면 Person(const Person& p)를 수동으로 작업해주어야 합니다.
*/
Person p2 = p1;
결과 => 생성자가 메모리 동적할당이 있다면, 복사생성자도 반드시 수동 구현해주어야 한다.
3. 복사 생성자의 호출 시기
- 기존에 생성된 객체로 새로운 객체를 초기화
Person p1;
Person p2 = p1;
- 함수 호출시 객체를 값에 의해 전달
void function(Person p){
p.show();
}
int main() {
Person p1(30);
function(p1); // 여기에서 해당 function 매개변수 Person 의 p 에 복사생성자가 일어난다.
return 0;
}
- 함수 내에서 객체를 값에 의해 리턴
Person function(void){
Person p(10);
return p; // 값에 의한 Person 객체 전달, p 객체의 복사본을 리턴시키게 된다.
}
int main() {
function();
function().show(); // 10 출력
return 0;
}