c++ 복사 구조 함수 변조 방지 예시

2679 단어
일반 유형의 대상에게 그들 사이의 복제는 간단하다. 예를 들어 다음과 같다.
 
  
int a = 88;
int b = a;

반면에 클래스와 일반 대상이 다르고 클래스 대상의 내부 구조는 일반적으로 비교적 복잡하며 각종 구성원 변수가 존재한다.
 
  
#include
using namespace std;

class CExample {
private:
 int a;
public:
     CExample(int b)
 { a=b;}
 void Show ()
 {
        cout<    }};

int main()
{
     CExample A(100);
     CExample B=A;
     B.Show ();
 return 0;
}


프로그램을 실행하고 화면을 100으로 출력합니다.이상의 코드 실행 결과를 통해 알 수 있듯이 시스템은 B에 메모리를 분배하고 대상 A의 복제 과정을 완성했다.
대상의 경우 같은 유형의 대상은 복사 구조 함수를 통해 전체 복제 과정을 완성한다.
 
  
CExample(const CExample& C)
 {
        a=C.a;
 }
 

Cexample (const Cexample & C) 은 우리가 정의한 복사 구조 함수입니다.이를 통해 알 수 있듯이 복제 구조 함수는 특수한 구조 함수로서 함수의 명칭은 반드시 클래스 명칭과 일치해야 한다. 그의 유일한 매개 변수는 이 유형의 인용 변수이고 이 매개 변수는const 유형으로 변할 수 없다.예를 들어 클래스 X의 복사 구조 함수의 형식은 X(X&x)이다.
초기화된 사용자 정의 클래스 형식의 대상을 사용하여 다른 새로운 구조의 대상을 초기화할 때, 복사 구조 함수는 자동으로 호출됩니다.클래스의 대상이 복사를 필요로 할 때 복사 구조 함수가 호출된다는 것이다.다음 경우 복사 구조 함수를 호출합니다. 한 대상이 값을 전달하는 방식으로 함수체에 전달되고, 한 대상이 값을 전달하는 방식으로 함수에서 한 대상을 되돌려받으려면 다른 대상을 통해 초기화해야 합니다.
클래스에서 복사 구조 함수를 명확하게 설명하지 않으면 컴파일러는 자동으로 기본 복사 구조 함수를 생성하고 이 구조 함수는 대상 간의 위치 복사를 완성합니다.비트 복사는 일명 얕은 복사라고도 하는데, 뒤에 설명할 것이다.
사용자 정의 복사 구조 함수는 좋은 프로그래밍 스타일로 컴파일러가 기본적인 복사 구조 함수를 형성하는 것을 막고 원본 효율을 높일 수 있다.
얕은 복사와 깊은 복사
어떤 상황에서 클래스 내 구성원 변수는 동적 메모리를 개척해야 한다. 만약에 비트 복사를 실행한다면 대상의 값을 다른 대상, 예를 들어 A=B에게 완전히 복사하는 것이다.이때 만약에 B의 구성원 변수 바늘이 메모리를 신청했다면 A의 그 구성원 변수도 같은 메모리를 가리킨다.이것은 문제가 생겼다. B가 메모리를 풀었을 때 (예를 들어 분석구조) A 안의 지침이 야생 지침이어서 운행 오류가 발생했다.
깊이 복사와 얕은 복사는 간단하게 이해할 수 있다. 만약에 하나의 클래스가 자원을 가지고 있다면 이 클래스의 대상이 복제 과정을 일으킬 때 자원을 재분배한다. 이 과정은 깊이 복사이고 반대로 자원을 재분배하지 않으면 얕은 복사이다.다음은 심도 있는 복사의 예를 들자.
 
  
#include
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};

int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
}

좋은 웹페이지 즐겨찾기