copy control 복제 제어

2861 단어 copy
모든 유형은 내장 유형이든 클래스 유형이든 이 유형의 대상의 한 그룹(비어 있을 수 있는) 작업의 의미를 정의한다.예를 들어, 우리는 두 개의 int 값을 더해서vector 대상의size 조작을 실행할 수 있다.이 조작들은 주어진 유형의 대상으로 어떤 임무를 완성할 수 있는지 정의했다.
복제 구조 함수, 부수 조작부호와 분석 함수를 총칭하여 복제 제어(copy control)라고 한다.
컴파일러는 자동으로 이러한 조작을 실현하지만, 클래스도 자신의 버전을 정의할 수 있다.
 
복제 구조 함수:
직접 초기화와 복제 초기화.
string null_book = "9-99-99999-9";//copy-initialization
string dots(10,'.');                        //direct-initializaton
string empty_copy=string();          //copy-initialization
string empty_direct;                     //direct-initialization
합성된 복제 구조 함수
만약 우리가 복제 구조 함수를 정의하지 않았다면, 컴파일러는 우리에게 하나를 합성해 줄 것이다.합성의 기본 구조 함수와 달리 우리가 다른 구조 함수를 정의하더라도 복제 구조 함수를 합성할 수 있다.복제구조 함수(synthesized copy constructor)를 합성하는 행위는 구성원별로 초기화(memberwise initialize)를 실행하고 새 대상을 원래 대상의 복사본으로 초기화하는 것이다.
이른바 '구성원 하나하나' 는 컴파일러가 기존 대상의 모든 비static 구성원을 순서대로 만들고 있는 대상으로 복사하는 것을 가리킨다.단 하나의 예외가 있는데, 각 구성원의 유형이 그 구성원을 복제하는 의미를 결정한다.
합성 복제 구조 함수는 내장 형식 구성원의 값을 직접 복제합니다.
클래스 형식 구성원은 이 클래스의 복제 구조 함수를 사용하여 복제합니다.
그룹 구성원의 복제는 예외입니다. 일반적으로 그룹을 복제할 수 없지만, 클래스가 그룹 구성원을 가지고 있다면, 합성 복제 함수는 그룹을 복제합니다.그룹을 복제할 때 복제 구조 함수를 합성하면 그룹의 모든 요소를 복제합니다.
Sales_item :: Sales_item(const Sales_item &rhs):

	isbm( rhs.isbn  ),		//calls string copy constructor

	units_sold ( rhs.units_sold),	//copy rhs.units_sold

	revenue (rhs.revenue)

{ }




복제를 금지합니다. 클래스는 복제 구조 함수가private라는 것을 명시해야 합니다.
 
합성 할당 조작부호(synthesized assignment operator)는 합성 복제 구조 함수와 유사하다.그것은 구성원마다 값을 부여할 것이다.
e.g. Sales_item의 작성 대입 연산자는 다음과 같습니다.
//equivalent to the synthesized assignment operator



Sales_item & Sales_item::operator = (const Sales_item & rhs){

	isbm = rhs.isbn;//calls string::operator =

	units_sold = rhs.units_sold; //use built-in int assignment

	revenue =rhs.revenue;

	return *this;

}


 
demo:
#include <iostream>

#include <string>



using namespace std;



class my_class{

public:

    int a;

    string s;

    char ch[10];

    void to_s(){

        cout<<"a address:"<<&a<<",a val:"<< a<<","<<endl

        <<"s address:"<<&s<<",s val:"<<s<<"," <<endl

        <<"ch address:"<<&ch<<",ch val:"<<ch<<endl;

    }

};

int main()

{

    my_class obj;

    obj.a=10;

    obj.s="danniswu ";

    obj.ch={'h','e','l','\0'};

    obj.to_s();



    my_class obj2(obj);

    obj2.to_s();

    return 0;

}




 
만약 클래스가 분석 함수를 필요로 한다면, 그것도 부수 조작부호와 복제 구조 함수를 필요로 한다. 이것은 유용한 경험 법칙이다.이 규칙은 흔히 삼법칙(rule of three)이라고 하는데, 분석 함수가 필요하면 이 세 개의 복제 제어 구성원이 필요하다는 것을 말한다.

좋은 웹페이지 즐겨찾기