여기서 우리는 C++에서 자신의 할당 연산자를 생성해야 할 때를 볼 것입니다. 클래스에 포인터가 없으면 할당 연산자와 복사 생성자를 만들 필요가 없습니다. C++ 컴파일러는 각 클래스에 대해 복사 생성자와 할당 연산자를 생성합니다. 연산자가 충분하지 않으면 자체 할당 연산자를 만들어야 합니다.
예시
#include<iostream> using namespace std; class MyClass { //no user defined assignment operator or copy constructor is present int *ptr; public: MyClass (int x = 0) { ptr = new int(x); } void setValue (int x) { *ptr = x; } void print() { cout << *ptr << endl; } }; main() { MyClass ob1(50); MyClass ob2; ob2 = ob1; ob1.setValue(100); ob2.print(); }
출력
100
main() 함수에서 ob1에 대해 setValue() 메서드를 사용하여 x 값을 설정했습니다. 값은 객체 ob2에도 반영됩니다. 이러한 유형의 예기치 않은 변경으로 인해 몇 가지 문제가 발생할 수 있습니다. 사용자 정의 할당 연산자가 없으므로 컴파일러에서 생성합니다. 여기에서 RHS의 ptr을 LHS로 복사합니다. 따라서 두 포인터가 모두 같은 위치를 가리키고 있습니다.
이 문제를 해결하기 위해 두 가지 방법을 따를 수 있습니다. 개체 복사를 제한하기 위해 더미 개인 할당 연산자를 만들거나, 그렇지 않으면 자체 할당 연산자를 만들 수 있습니다.
예시
#include<iostream> using namespace std; class MyClass { //no user defined assignment operator or copy constructor is present int *ptr; public: MyClass (int x = 0) { ptr = new int(x); } void setValue (int x) { *ptr = x; } void print() { cout << *ptr << endl; } MyClass &operator=(const MyClass &ob2) { // Check for self assignment if(this != &ob2) *ptr = *(ob2.ptr); return *this; } }; main() { MyClass ob1(50); MyClass ob2; ob2 = ob1; ob1.setValue(100); ob2.print(); }
출력
50
여기서 할당 연산자는 깊은 복사를 생성하고 별도의 포인터를 저장하는 데 사용됩니다. 우리가 명심해야 할 한 가지. 자체 참조를 확인해야 합니다. 그렇지 않으면 할당 연산자가 현재 개체의 값을 변경할 수 있습니다.