C++에서 복사 생성자 활용
이 기사에서는 C++에서 복사 생성자를 활용하는 방법에 대한 몇 가지 방법을 설명합니다.
복사 생성자를 사용하여 C++에서 동일한 유형의 다른 개체에서 개체 초기화
클래스에는 집합 적으로복사 제어
라고하는 여러 작업이 있습니다. 이러한 작업은 지정된 클래스 유형의 개체가 복사, 이동, 할당 또는 삭제되는 방법을 정의합니다. 이 기사에서는 복사 생성자와 복사 할당에만 초점을 맞출 것입니다.
복사 생성자는 참조로 전달 된 인수의 값을 복제하여 객체를 초기화합니다 (일반적으로const
참조로 전달됨). 컴파일러가 정의되지 않은 작업에 대한 합성 작업을 자동으로 정의하기 때문에 클래스는 복사 생성자를 다른 복사 제어 작업으로 정의 할 필요가 없습니다. 하지만 후자의 경우 종종 문제가 발생할 수 있습니다. 합성 된 복사 생성자는 인수 개체의 각 멤버를 생성중인 개체에 복사합니다. 복사 생성자에 의해 복사되는 다른 클래스 유형의 멤버가있을 수 있습니다. 반대로 내장 유형 객체는 직접 복사됩니다.
다음 예제 코드는MyClass
의 복사 생성자의 동작을 보여줍니다. 복사 생성자에 대한 유일한 필수 인수를 취한 다음 데이터 멤버를 초기화합니다. 반면에 복사 생성자는 추가 인수를 가질 수 있으며 이는 선택 사항이어야하며 기본값을 가져야합니다.
MyClass
유형의 오브젝트가 처음에 작성되면 기본 생성자가 호출됩니다. 그러나 새로 생성 된m3
변수에m1
을 할당하면 복사 생성자가 호출됩니다. 후자의 작업은 복사 초기화라고도하며, 복사 생성자를 사용하거나 생성자를 이동할 수 있습니다 (다른 문서에서 논의 됨).
#include <iostream>
using std::cout;
using std::endl;
using std::pair;
class MyClass {
private:
int n1{};
int n2{};
public:
MyClass(int x, int y) : n1(x), n2(y) {
cout << "Constructor 1 is called" << endl;
};
MyClass(const MyClass& src) {
cout << "Copy Constructor is called " << endl;
n1 = src.n1;
n2 = src.n2;
}
auto getPair() { return pair<int, int>(n1, n2); }
~MyClass() = default;
};
int main() {
MyClass m1(12, 21);
cout << "------------------" << endl;
MyClass m2(11, 33);
cout << "------------------" << endl;
MyClass m3 = m1;
cout << "------------------" << endl;
cout << m1.getPair().first << m1.getPair().second << endl;
cout << m2.getPair().first << m2.getPair().second << endl;
cout << m3.getPair().first << m3.getPair().second << endl;
return EXIT_SUCCESS;
}
출력:
Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
1221
1133
1221
복사 할당 연산자를 사용하여 C++에서 개체에 대한 할당 연산자 오버로드 정의
복사 할당 연산자는 동일한 유형의 개체를 할당하는 방법을 정의합니다. 컴파일러는 사용자가 명시 적으로 정의하지 않은 경우에도이 작업을 합성합니다. 복사 할당은 다른 연산자 오버로딩 기능과 유사하게 설명됩니다. 클래스와 동일한 유형의 인수를 사용하며 일반적으로 왼쪽 피연산자에 대한 참조를 반환합니다. 복사 할당 연산자는 멤버 함수로 정의되어야합니다.
다음 코드 조각은MyClass
에 대한 복사 할당 연산자를 추가하고m2
개체를m1
에 할당하는 동안 호출합니다.
#include <iostream>
using std::cout;
using std::endl;
using std::pair;
class MyClass {
private:
int n1{};
int n2{};
public:
MyClass(int x, int y) : n1(x), n2(y) {
cout << "Constructor 1 is called" << endl;
};
MyClass(const MyClass& src) {
cout << "Copy Constructor is called " << endl;
n1 = src.n1;
n2 = src.n2;
}
MyClass& operator=(const MyClass& src) {
cout << "Copy Assignment is called " << endl;
n1 = src.n1;
n2 = src.n2;
return *this;
}
auto getPair() { return pair<int, int>(n1, n2); }
~MyClass() = default;
};
int main() {
MyClass m1(12, 21);
cout << "------------------" << endl;
MyClass m2(11, 33);
cout << "------------------" << endl;
MyClass m3 = m1;
cout << "------------------" << endl;
m1 = m2;
cout << "------------------" << endl;
cout << m1.getPair().first << m1.getPair().second << endl;
cout << m2.getPair().first << m2.getPair().second << endl;
cout << m3.getPair().first << m3.getPair().second << endl;
return EXIT_SUCCESS;
}
출력:
Constructor 1 is called
------------------
Constructor 1 is called
------------------
Copy Constructor is called
------------------
Copy Assignment is called
------------------
1221
1133
1221
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook