C++복사 구조 함수

복사 구조 함 수 는 특수 한 구조 함수 로 대상 을 만 들 때 같은 클래스 에서 만 든 대상 을 사용 하여 새로 만 든 대상 을 초기 화 합 니 다.복사 구조 함 수 는 보통:
  • 다른 유형의 대상 을 사용 하여 새로 만 든 대상 을 초기 화 합 니 다
  • 복사 대상 은 이 를 매개 변수 로 함수 에 전달 합 니 다4.567917.대상 을 복사 하고 함수 에서 이 대상 을 되 돌려 줍 니 다클래스 에서 복사 구조 함 수 를 정의 하지 않 으 면 컴 파일 러 는 스스로 하 나 를 정의 합 니 다.만약 클래스 가 포인터 변 수 를 가지 고 동적 메모리 분배 가 있다 면,그것 은 반드시 복사 구조 함수 가 있어 야 한다.복사 구조 함수 의 가장 흔 한 형식 은 다음 과 같다.
    
    classname (const classname &obj) {
      //        
    }
    여기 서 obj 는 대상 참조 입 니 다.이 대상 은 다른 대상 을 초기 화 하 는 데 사 용 됩 니 다.
    
    #include <iostream>
     
    using namespace std;
     
    class Line
    {
      public:
       int getLength( void );
       Line( int len );       //        
       Line( const Line &obj);   //       
       ~Line();           //     
     
      private:
       int *ptr;
    };
     
    //       ,      
    Line::Line(int len)
    {
      cout << "      " << endl;
      //        
      ptr = new int;
      *ptr = len;
    }
     
    Line::Line(const Line &obj)
    {
      cout << "             ptr     " << endl;
      ptr = new int;
      *ptr = *obj.ptr; //    
    }
     
    Line::~Line(void)
    {
      cout << "    " << endl;
      delete ptr;
    }
    int Line::getLength( void )
    {
      return *ptr;
    }
     
    void display(Line obj)
    {
      cout << "line    : " << obj.getLength() <<endl;
    }
     
    //       
    int main( )
    {
      Line line(10);
     
      display(line);
     
      return 0;
    }
    위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
    호출 구조 함수
    복사 구조 함 수 를 호출 하고 포인터 ptr 에 메모 리 를 할당 합 니 다.
    줄 크기:10
    메모리 방출
    메모리 방출
    아래 의 인 스 턴 스 는 위의 인 스 턴 스 를 약간 수정 하고 같은 유형의 대상 을 사용 하여 새로 만 든 대상 을 초기 화 합 니 다.
    
    #include <iostream>
     
    using namespace std;
     
    class Line
    {
      public:
       int getLength( void );
       Line( int len );       //        
       Line( const Line &obj);   //       
       ~Line();           //     
     
      private:
       int *ptr;
    };
     
    //       ,      
    Line::Line(int len)
    {
      cout << "      " << endl;
      //        
      ptr = new int;
      *ptr = len;
    }
     
    Line::Line(const Line &obj)
    {
      cout << "             ptr     " << endl;
      ptr = new int;
      *ptr = *obj.ptr; //    
    }
     
    Line::~Line(void)
    {
      cout << "    " << endl;
      delete ptr;
    }
    int Line::getLength( void )
    {
      return *ptr;
    }
     
    void display(Line obj)
    {
      cout << "line    : " << obj.getLength() <<endl;
    }
     
    //       
    int main( )
    {
      Line line1(10);
     
      Line line2 = line1; //             
     
      display(line1);
      display(line2);
     
      return 0;
    }
    위의 코드 가 컴 파일 되 고 실 행 될 때 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.
    호출 구조 함수
    복사 구조 함 수 를 호출 하고 포인터 ptr 에 메모 리 를 할당 합 니 다.
    복사 구조 함 수 를 호출 하고 포인터 ptr 에 메모 리 를 할당 합 니 다.
    줄 크기:10
    메모리 방출
    복사 구조 함 수 를 호출 하고 포인터 ptr 에 메모 리 를 할당 합 니 다.
    줄 크기:10
    메모리 방출
    메모리 방출
    메모리 방출
    왜 클래스 구성원 에 포인터 형식 구성원 이 포함 되 어 있 고 메모리 할당 이 필요 할 때 반드시 총 정의 복사 구조 함수 가 있어 야 합 니까?
    기본 복사 구조 함 수 는 얕 은 복사 만 이 루어 집 니 다.즉,원래 대상 의 데이터 구성원 수 치 를 새 대상 에 해당 하 는 데이터 구성원 에 게 순서대로 복사 하고 새로운 대상 에 게 메모리 자원 을 따로 분배 하지 않 았 습 니 다.
    이렇게 하면 대상 의 데이터 구성원 이 지침 이 라면 두 지침 대상 은 실제로 같은 메모리 공간 을 가리킨다.
    어떤 경우 에는 얕 은 복사 가 데이터 안전 상의 위험 을 가 져 온다.
    클래스 의 데이터 구성원 중 포인터 형식 이 있 을 때 우 리 는 특정한 복사 구조 함 수 를 정의 해 야 한다.이 복사 구조 함 수 는 원래 대상 과 새로운 대상 간 의 데이터 구성원 의 복사 를 실현 할 수 있 을 뿐만 아니 라 새로운 대상 에 게 단독 메모리 자원 을 분배 할 수 있다.이것 은 바로 깊 은 복사 구조 함수 이다.
    어떻게 기본 복사 발생 을 방지 합 니까?
    개인 적 인 복사 구조 함 수 를 설명 합 니 다.복사 구조 함 수 는 개인 적 인 것 이기 때문에 사용자 가 값 에 따라 전달 하거나 함수 에 따라 이러한 대상 으로 돌아 가 려 고 하면 컴 파일 러 는 오 류 를 보고 하여 값 에 따라 전달 하거나 대상 으로 돌아 가 는 것 을 피 할 수 있 습 니 다.
    요약:
    클래스 의 등호 할당 이 나타 날 때 복사 함 수 를 호출 합 니 다.복사 구조 함 수 를 정의 하지 않 은 상태 에서 시스템 은 기본 복사 함수 인 얕 은 복사 함 수 를 호출 합 니 다.이것 은 구성원 의 일 일 복 제 를 완성 할 수 있 습 니 다.데이터 구성원 중 지침 이 없 을 때 얕 은 복사 가 가능 하 다.그러나 데이터 구성원 중 포인터 가 있 을 때 간단 한 얕 은 복사 본 을 사용 하면 두 가지 포인터 가 같은 주 소 를 가리 키 고 대상 이 끝나 갈 때 두 번 의 분석 함 수 를 호출 하여 포인터 가 걸 리 는 현상 을 초래 합 니 다.그래서 이 럴 때 는 반드시 깊 은 복사 본 을 사용 해 야 한다.
    깊 은 복사 와 얕 은 복사 의 차 이 는 깊 은 복사 가 메모리 에 따로 공간 을 신청 하여 데 이 터 를 저장 하 는 것 으로 지침 이 걸 려 있 는 문 제 를 해결 하 는 것 이다.한 마디 로 데이터 멤버 중 지침 이 있 을 때 는 깊 은 복사 가 필요 하 다.
    이상 은 C++복사 구조 함수 에 대한 상세 한 내용 입 니 다.C+복사 구조 함수 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기