C++에서 구조 함수,복사 구조 함수 와 할당 함수 의 차이 점 과 실현

C++에서 일반적으로 대상 을 만 들 고 복사 하거나 할당 하 는 방식 은 구조 함수,복사 구조 함수,할당 함수 등 세 가지 방법 이 있 습 니 다.다음은 세 사람 간 의 차이 점 과 그들의 구체 적 인 실현 을 상세히 비교 해 보 자.
1.구조 함수
구조 함 수 는 특수 한 클래스 구성원 함수 로 클래스 의 대상 을 만 들 때 클래스 의 데이터 구성원 을 초기 화하 고 메모 리 를 분배 하기 위해 호출 됩 니 다.(구조 함수 의 이름 은 클래스 이름과 완전히 같 아야 합 니 다)
먼저 C++의 빈 클래스 를 말 해 보 세 요.컴 파 일 러 는 어떤 기본 멤버 함 수 를 추가 합 니까?
기본 구조 함수 와 복사 구조 함수
분석 함수
할당 함수(할당 연산 자)
수치 함수
**프로그램 이 구성원 을 정의 하지 않 아 도 컴 파일 러 는 이상 의 함 수 를 삽입 합 니 다!
메모:구조 함 수 는 다시 불 러 올 수 있 습 니 다.여러 개 할 수 있 고 인 자 를 가 져 올 수 있 습 니 다.분석 함수 가 하나 밖 에 없어 서 다시 불 러 올 수 없고 인자 가 없습니다.
기본 구조 함 수 는 인자 가 없고 아무것도 하지 않 습 니 다.무 참 구조 함수 가 다시 로드 되 지 않 았 을 때,
A a 는 기본 구조 함 수 를 통 해 대상 을 만 드 는 것 입 니 다.
다음 코드 는 구조 함수 과부하 의 실현 입 니 다.

<span style="font-size:14px;">class A
{
int m_i;
Public:
 A() 
{
 Cout<<”      ”<<endl;
}
A(int i):m_i(i) {} //     
}</span>
2.복사 구조 함수
복사 구조 함 수 는 C++만 있 는 특수 한 구조 함수 로 같은 유형의 대상 구조 와 다른 대상 을 초기 화 합 니 다.
복사 구조 함 수 를 다시 불 러 오지 않 았 을 때 기본 복사 구조 함 수 를 통 해 대상 을 만 듭 니 다.
A a;
A b(a);
A b=a;  모두 복사 구조 함수 로 대상 b 를 만 듭 니 다.
강조:여기 b 대상 은 존재 하지 않 습 니 다.a 대상 으로 b 를 구성 하고 초기 화 합 니 다!!
구조 함수 가 언제 호출 될 지 먼저 말씀 드 리 겠 습 니 다.
C++에서 3 가지 대상 을 복사 해 야 합 니 다.이때 복사 구조 함수 가 호출 됩 니 다.
4.567917.1)한 대상 이 값 으로 전달 하 는 방식 으로 함수 체 에 전달한다4.567917.2)한 대상 이 값 으로 전달 하 는 방식 으로 함수 에서 되 돌아 갑 니 다4.567917.3)한 대상 은 다른 대상 을 통 해 초기 화 해 야 한다컴 파일 러 가 기본 복사 구조 함 수 를 생 성 할 때:
4.567917.1)사용자 가 사용자 정의 복사 구조 함 수 를 사용 하지 않 고 코드 에서 복사 구조 함 수 를 사용 하면 컴 파일 러 는 기본 복사 구조 함 수 를 생 성 할 것 이다.그러나 사용자 가 복사 구조 함 수 를 정의 하면 컴 파일 러 는 생 성 되 지 않 습 니 다4.567917.2)만약 에 사용자 가 구조 함 수 를 정 의 했 지만 복사 구조 함수 가 아니 라 이때 코드 에 복사 구조 함 수 를 사용 하면 컴 파일 러 도 기본 적 인 복사 구조 함 수 를 생 성 할 것 이다시스템 이 제공 하 는 기본 복사 구조 함수 작업 방식 은 메모리 복사,즉 얕 은 복사 이기 때문이다.대상 에 수 동 으로 풀 어야 할 대상 을 사용 하면 문제 가 발생 할 수 있 습 니 다.이 때 는 복사 구조 함 수 를 수 동 으로 다시 불 러 와 심 한 복사 가 이 루어 져 야 합 니 다.
다음은 깊 은 복사 와 얕 은 복사:
4.567917.얕 은 복사:복사 대상 에서 하나의 외부 내용(예 를 들 어 쌓 인 데이터)을 인용 하면 이 대상 을 복사 할 때 신 구 두 대상 이 같은 외부 내용 을 가리 키 게 하 는 것 이 바로 얕 은 복사 이다.(포인터 가 복사 되 었 지만 가리 키 는 공간 내용 은 복사 되 지 않 고 두 대상 이 공유 하 며 두 대상 이 독립 되 지 않 고 공간 이 존재 합 니 다)4.567917.심 복사:이 대상 을 복사 할 때 새로운 대상 에 게 외부 대상 의 독립 복 제 를 만 들 었 다 면 심 복사 이다복사 구조 함수 재 업로드 설명 은 다음 과 같 습 니 다.
A (const A&other)
다음은 복사 구조 함수 의 실현:

<span style="font-size:14px;">class A
{
 int m_i
 A(const A& other):m_i(other.m_i)
{
 Cout<<”      ”<<endl;
}
}</span>

3.할당 함수
한 클래스 의 대상 이 이 클래스 의 다른 대상 에 게 값 을 부여 할 때 이 클래스 의 할당 함 수 를 사용 합 니 다.
할당 함수(할당 연산 자)를 다시 불 러 오지 않 았 을 때 기본 할당 함수 로 할당 작업 을 합 니 다.
A a;
A b;
b=a; 
강조:여기 a,b 대상 은 이미 존재 합 니 다.a 대상 으로 b 에 게 값 을 부여 합 니 다!!
할당 연산 의 과부하 설명 은 다음 과 같 습 니 다.
 A& operator = (const A& other)
보통 사람들 은 복사 구조 함수 와 할당 함수 에 대해 헷 갈 리 는데 여기 서 이들 의 차 이 를 자세히 비교 합 니 다.
1)복사 구조 함 수 는 대상 이 메모리 영역 을 초기 화 하 는 것 입 니 다.이 메모 리 는 새로운 대상 의 메모리 영역 이 고 할당 함 수 는 초기 화 된 대상 에 대해 할당 작업 을 합 니 다.

<span style="font-size:14px;">class A;
A a;
A b=a;  //        (b   )
A c(a) ;  //        
 
/****/
 
class A;
A a;
A b;  
b = a ;  //      (b  )</span>

2)일반적으로 데이터 구성원 이 지침 대상 을 포함 할 때 두 가지 서로 다른 처리 수 요 를 고려 해 야 한다.하 나 는 복사 지침 대상 이 고 다른 하 나 는 인용 지침 대상 이다.복사 구조 함 수 는 대부분 복사 이 고 할당 함 수 는 참조 대상 입 니 다.
3)실현 이 다르다.복사 구조 함 수 는 먼저 구조 함수 입 니 다.호출 할 때 매개 변수의 대상 을 통 해 대상 을 초기 화 합 니 다.할당 함 수 는 새로운 대상 을 원래 의 대상 에 게 할당 하 는 것 입 니 다.따라서 원래 의 대상 에 메모리 할당 이 있 으 면 먼저 메모 리 를 풀 어야 합 니 다.그리고 두 대상 이 같은 대상 인지 확인 해 야 합 니 다.만약 에 그 렇 더 라 도 어떠한 조작 도 하지 않 고 바로 돌아 갑 니 다.(이 요점 들 은 아래 String 구현 코드 에 나타 납 니 다)
!!!복사 구조 함수 와 할당 함 수 를 쓰 지 않 으 려 면 다른 사람 이 컴 파일 러 로 생 성 된 결 성 함 수 를 사용 하 는 것 을 허용 하지 않 습 니 다.가장 쉬 운 방법 은 복사 구조 함수 와 할당 함 수 를 개인 함수 로 설명 하 는 것 입 니 다.코드 를 만 들 지 않 아 도 됩 니 다.예:

<span style="font-size:14px;">class A
{
 private:
 A(const A& a); //        
 A& operate=(const A& a); //      
}</span>
프로그램 이 이렇게 쓰 면 오류 가 발생 합 니 다.

<span style="font-size:14px;">A a;
A b(a); //           ,    
 
A b;
b=a; //         ,    </span>
따라서 클래스 정의 에 포인터 나 인용 변수 나 대상 이 있 으 면 잠재 적 인 오 류 를 피하 기 위해 복사 구조 함수 와 할당 함 수 를 다시 불 러 오 는 것 이 좋 습 니 다.
다음은 string 류 의 실현 을 예 로 들 어 일반 구조 함수,복사 구조 함수,할당 함수 의 실현 을 완전 하 게 썼 다.String 류 의 기본 적 인 실현 은 나의 또 다른 박문 을 볼 수 있다.

<span style="font-size:14px;">String::String(const char* str)  //      
 
{
 
 cout<<construct<<endl;
 
 if(str==NULL)    //  str  NULL,        “”
 
{
 m_string=new char[1];
 *m_string ='\0';
}
 
 else
 
{
 
 m_string= new char[strlen(str)+1] ;  //    
 strcpy(m_string,str);
 
}
 
}
 
 
String::String(const String&other)  //      
 
{
 cout<<"copy construct"<<endl;
 m_string=new char[strlen(other.m_string)+1]; //       
 strcpy(m_string,other.m_string);
}
 
String & String::operator=(const String& other) //     
{
 cout<<"operator =funtion"<<endl ;
 if(this==&other) //     other      ,      
 {
 return *this;
 }
 delete []m_string; //        
 m_string= new char[strlen(other.m_string)+1];
 strcpy(m_string,other.m_string);
 return * this;
}</span>

한 마디 로 세 가 지 를 기억 하 라.
대상 이 존재 하지 않 고 다른 대상 으로 초기 화 되 지 않 았 습 니 다.바로 구조 함 수 를 호출 한 것 입 니 다.
대상 이 존재 하지 않 고 다른 대상 으로 초기 화 하 는 것 이 바로 구조 함수 복사 입 니 다.(위 에서 세 가지 사용 상황 을 말 했 습 니 다!)
대상 이 존재 합 니 다.다른 대상 으로 값 을 부여 하 는 것 이 바로 할당 함수 입 니 다.
이상 은 저 에 게 많은 자료 와 도 서 를 결합 시 켜 정리 한 것 입 니 다.핵심 적 인 점 을 체계적으로 정리 하고 모두 조리 에 따라 썼 습 니 다.지금 은 일반 구조 함수,복사 구조 함수,할당 함수 의 차이 와 실현 에 대해 잘 알 고 있 을 것 입 니 다.
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 C++에서 구조 함수,복사 구조 함수 와 할당 함수 의 차이 점 과 상세 한 통합 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기