복사 생성자
C++에서는 클래스 이름과 이름이 같고 형식 매개변수가 이 클래스 객체의 참조 유형인 함수를 복사 생성자 라고 합니다. 생성자와 마찬가지로 시스템은 이를 적극적으로 정의하지 않을 때 자동으로 생성합니다. 다음 상황과 같이 객체를 초기화하는 데 사용되는 두 객체 멤버 간에 상응하는 단순 할당을 수행합니다.
#include<iostream>usingnamespacestd;#definePI3.1415classCircle{private:doubleR;public:Circle(doubleR);Circle(Circle&A);doublearea();doublegirth();};Circle::Circle(doubleR){cout<<생성자 <<endl;this->R=R;}원::원(원&A){cout<<CopyConstructor<<endl;this->R=AR;}doubleCircle::area(){returnPI*R*R;} doubleCircle::girth(){return2*PI*R;}intmain(){CircleA(5);CircleB(A);return0;}
이 예제에서는 Circle 클래스가 정의되고 매개 변수가 있는 생성자와 복사 생성자가 각각 정의됩니다. 그런 다음 기본 함수에 A 객체가 정의되고 초기 값이 전달되며 매개 변수가 있는 생성자가 호출됩니다. 그리고 B 객체를 정의하고, A 객체를 통해 B 객체를 초기화합니다. 실행 결과는 다음과 같습니다.
처음 정의된 A 객체는 매개변수로 생성자를 호출하고, 두 번째 B 객체는 A 객체를 통해 초기화되므로 복사 생성자가 호출됩니다.
컴퓨터에서도 시도해 보세요.
질문이 있을 수 있습니다. 처음에 복사 생성자를 적극적으로 정의하지 않으면 복사 생성자가 자동으로 생성되는데 왜 직접 정의해야 합니까? 왜냐하면 기본 복사 생성자는 단순 할당만 수행하기 때문입니다. 경우에 따라 딥 복사 및 얕은 복사 와 관련된 문제가 발생할 수 있습니다. 이에 대해서는 다음 섹션에서 자세히 소개하겠습니다.