C++복사 구조 함수
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+복사 구조 함수 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 원활 공사 & & 원활 공사 (차 트 법)모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.