복사 구조 함수와 깊이 복사 예
1674 단어 제13장: 복사 제어
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;
}