c++ 복사 구조 함수 변조 방지 예시
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.