Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 우리 자신의 할당 연산자를 언제 작성해야 합니까?

<시간/>

여기서 우리는 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

여기서 할당 연산자는 깊은 복사를 생성하고 별도의 포인터를 저장하는 데 사용됩니다. 우리가 명심해야 할 한 가지. 자체 참조를 확인해야 합니다. 그렇지 않으면 할당 연산자가 현재 개체의 값을 변경할 수 있습니다.