추천, 2024

에디터의 선택

C ++에서 복사 생성자와 할당 연산자의 차이점

복사 생성자와 대입 연산자는 다른 객체를 사용하여 하나의 객체를 초기화하는 두 가지 방법입니다. 복사 생성자와 할당 연산자의 근본적인 차이점은 복사 생성자가 새로 생성 된 대상 객체와 소스 객체와 같은 두 객체에 별도의 메모리를 할당한다는 것입니다. 할당 연산자는 새로 생성 된 대상 객체에 동일한 메모리 위치를 할당하고 소스 객체.

복사 생성자와 대입 연산자의 차이점을 알아 보겠습니다.

비교 차트

비교의 근거복사 생성자배정 연산자
기본복사 생성자는 오버로드 된 생성자입니다.대입 연산자는 비트 연산자입니다.
의미복사 생성자는 이미 존재하는 객체로 새 객체를 초기화합니다.대입 연산자는 한 객체의 값을 이미 존재하는 다른 객체에 할당합니다.
통사론class_name (cont class_name & object_name) {
// 생성자의 본문
}
class_name Ob1, Ob2;
Ob2 = Ob1;
호출(1) 복사 생성자는 새 객체가 기존 객체로 초기화 될 때 호출합니다.
(2) 비 - 참조 매개 변수로서 함수에 전달 된 객체.
(3) 객체가 함수에서 반환됩니다.
할당 연산자는 기존 객체에 새 객체를 할당 할 때만 호출됩니다.
메모리 할당대상 객체와 초기화 객체는 서로 다른 메모리 위치를 공유합니다.대상 객체와 초기화 객체 모두 동일한 할당 된 메모리를 공유합니다.
태만프로그램에서 복사 생성자를 정의하지 않으면 C ++ 컴파일러가 암시 적으로이를 제공합니다."="연산자를 오버로드하지 않으면 비트 단위로 복사됩니다.

복사 생성자의 정의

"복사 생성자"는 오버로드 된 생성자 의 한 형태입니다. 복사 생성자는 초기화 목적으로 만 호출되거나 호출됩니다. 복사 생성자는 새로 생성 된 객체를 다른 기존 객체로 초기화합니다. 복사 생성자를 사용하여 새로 생성 된 대상 객체를 초기화하면 대상 객체와 소스 객체가 서로 다른 메모리 위치를 공유합니다. 원본 개체에 대한 변경 내용은 대상 개체에 반영되지 않습니다. 복사 생성자의 일반적인 형식은 다음과 같습니다.

 class_ name (class_name & object_name) {. // 복사 생성자의 본문입니다. } // object_name은 초기화의 오른쪽에있는 객체를 참조합니다. 

프로그래머가 C ++ 프로그램에서 복사 생성자를 만들지 않으면 컴파일러에서 암시 적으로 복사 생성자를 제공합니다. 컴파일러에서 제공하는 암시 적 복사본 생성자는 원본 개체의 구성원 별 복사본을 수행합니다. 그러나 객체가 포인터 변수를 포함 할 수 있기 때문에 가끔씩 구성원 별 사본으로는 충분하지 않습니다. 포인터 변수를 복사하는 것은 포인터 변수에 저장된 주소를 복사하지만 포인터 변수에 저장된 주소를 복사하지 않고 포인터가 가리키는 포인터를 복사하려는 것입니다. 따라서 이러한 종류의 문제를 해결하기 위해 프로그램에 명시적인 '복사 생성자'가 필요합니다.

복사 생성자는 다음과 같은 세 가지 조건에서 호출됩니다.

  • 복사 생성자는 새 객체가 기존 객체로 초기화 될 때 호출합니다.
  • 함수에 비표준 매개 변수로 전달 된 개체입니다.
  • 개체가 함수에서 반환됩니다.

예제로 복사 생성자를 이해합시다.

 클래스 사본 {int num; public : copy () {} // 기본 생성자 copy (int a) {// 초기화 생성자 num = a; } copy (copy & c) {// 복사 생성자 num = c.num; } void show () {cout << num; }}; int main () {copy A (200); // 객체 A 생성 및 초기화 된 복사본 B (A); // copy C = A라는 생성자를 복사하십시오. // copy D라는 생성자를 복사합니다. D = A; // 객체 D가 새로 생성 된 객체가 아니기 때문에 생성자를 호출하지 않았습니다. // 그것은 할당 연산이다. 0을 반환; } 

위의 코드에서 나는 명시 적으로 생성자 "copy (copy & c)"를 선언했다. 이 복사 생성자는 객체 B가 객체 A를 사용하여 초기화 될 때 호출됩니다. 객체 C가 객체 A를 사용하여 초기화 될 때 두 번째로 호출됩니다. 객체 D가 객체 A를 사용하여 초기화되면 D가 초기화 될 때 복사 생성자가 호출되지 않습니다. 그것은 새로 창조 된 것이 아니라 이미 존재하고 있습니다. 따라서 여기서 대입 연산자가 호출됩니다.

배정 연산자의 정의

대입 연산자는 C ++의 대입 연산자입니다. "="연산자는 대입 연산자를 호출하는 데 사용됩니다. 그것은 한 객체의 데이터를 다른 객체와 동일하게 복사합니다. 할당 연산자는 한 객체를 다른 구성원에게 복사합니다. 대입 연산자를 오버로드하지 않으면 비트 대본을 수행합니다. 따라서 대입 연산자를 오버로드해야합니다.

 클래스 사본 {int num; public : copy () {} // 기본 생성자 copy (int a) {// 초기화 생성자 num = a; } void show () {cout << num; }}; int main () {copy A (200); // 객체 A 생성 및 초기화 된 복사본 B (300); // 생성되고 초기화 된 객체 B B = A; // 할당 연산자가 호출 됨 copy C; C = A; // 할당 연산자 호출 return 0; } 

위 코드에서 objectA가 객체 B에 할당되면 할당 연산자는 두 객체가 이미 존재하므로 호출됩니다. 마찬가지로 객체 C가 객체 A로 초기화되는 경우도 마찬가지입니다.

비트 할당이 수행되면 객체는 동일한 메모리 위치를 공유하고 한 객체의 변경 사항이 다른 객체에 반영됩니다.

복사 생성자와 할당 연산자의 주요 차이점

  1. 복사 생성자는 오버로드 된 생성자로서 대입 연산자는 비트 연산자입니다.
  2. 복사 생성자를 사용하여 이미 존재하는 객체로 새 객체를 초기화 할 수 있습니다. 한편, 대입 연산자는 하나의 객체를 이미 존재하는 다른 객체에 복사합니다.
  3. 복사 구성자는 새 오브젝트가 이미 존재하는 오브젝트로 초기화 될 때, 오브젝트가 비래시 매개 변수로 함수에 전달 될 때 또는 오브젝트가 함수에서 리턴 될 때마다 초기화됩니다. 반면에 대입 연산자는 객체가 다른 객체에 할당 될 때만 호출됩니다.
  4. 객체가 복사 생성자를 사용하여 초기화 될 때 초기화 객체와 초기화 된 객체는 서로 다른 메모리 위치를 공유합니다. 반면에 할당 연산자를 사용하여 객체를 초기화 할 때 초기화되고 초기화되는 객체는 동일한 메모리 위치를 공유합니다.
  5. 복사 생성자를 명시 적으로 정의하지 않으면 컴파일러에서 제공합니다. 반면에, 당신이 할당 연산자를 오버로드하지 않으면 비트 복사 작업이 수행됩니다.

결론:

Copy 생성자는 객체에 원시 포인터가 포함되어있을 때 객체를 다른 객체로 복사하는 데 가장 적합합니다.

Top