복사 구조 함수와 깊이 복사 예

1. 복사 구조 함수도 하나의 구조 함수로 대상을 구성하는 데 사용되며 대상이 정의될 때만 작용한다. 첫 번째 파라미터는 자신의 유형의 인용이고 다른 모든 파라미터는 기본값을 가진다.(만약 첫 번째 파라미터가 인용 형식이 아니라면 복사 대상을 구성할 때 복사 구조 함수를 호출해야 하기 때문에 복사 구조 함수마저 복사 구조 함수를 호출해야 한다. 결과는 영원히 호출에 성공하지 못할 것이라는 것을 짐작할 수 있다)
2. 만약에 우리가 하나의 클래스에 복사 구조 함수를 정의하지 않았다면 컴파일러는 우리에게 합성된 복사 구조 함수라고 정의할 것이다. 설령 우리가 다른 구조 함수를 정의했다 하더라도 컴파일러는 우리를 위해 복사 구조 함수를 합성할 것이다.
3. 복사 구조 함수는 하나의 대상을 다른 유형의 대상에게 부여할 때의 조작, 즉 데이터 구성원을 하나하나 복사하는 것을 정의한다.
4. 복제 구조 함수를 호출하는 경우:
(1) = 을 사용하여 객체 정의
(2) 하나의 대상을 실참으로 비인용 유형의 대상을 전달한다
(3) 비인용 형식의 함수에서 대상을 되돌려줍니다
(4) 괄호로 한 그룹의 원소나 집합 클래스의 구성원을 초기화합니다
5. 컴파일러는 프로그램의 운영 효율을 높이기 위해 복사 구조 함수를 돌릴 때가 있다.
6. 클래스 구성원에 포인터 유형이 있을 때는 깊이 있는 복사를 사용하는 것이 좋다. 다음 프로그램은 예이다(포인터 구성원 함수가 존재하는 클래스에서 복사 구조 함수는 단순 복사 포인터의 값이면 얕은 복사이고 이 포인터에 같은 값의 메모리를 다시 분배하면 깊이 복사한다).
#include 
using namespace std;

class Cstr{
public:
int *a;
Cstr()
{
a = new int [3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
}

Cstr(const Cstr& str)
{
//a = str.a;                // , ( , )
this->a = new int[3];
/*this->a[0] = str.a[0];                // , 
this->a[1] = str.a[1];
this->a[2] = str.a[2];*/
memcpy(this->a, str.a, 12);                        // ( , , )
}
~Cstr()
{
delete[] a;
}
};

int main()
{
{
Cstr st;
cout << st.a[0] << " " << st.a[1] << " " << st.a[2]<< endl;
cout << st.a << endl;
Cstr at = st;
cout << at.a[0] << " " << at.a[1] << " " << at.a[2] << endl;
cout << at.a << endl;
}
Cst st;
*p = new Cst(st);  // 
system("pause");
return 0;
}

좋은 웹페이지 즐겨찾기