C++에서 할당 연산자 오버로딩 구현

Jinku Hu 2023년10월12일
C++에서 할당 연산자 오버로딩 구현

이 기사에서는 C++에서 할당 연산자 오버로딩을 구현하는 방법에 대한 몇 가지 방법을 설명합니다.

복사 할당 연산자를 사용하여 C++에서 오버로드 된 할당 연산자 구현

C++는 기본 제공 연산자가 특정 클래스에서 호출 될 때 사용자 지정 함수를 호출하는 일반적인 방법 인 연산자 오버로드 기능을 제공합니다. 이러한 함수는operator로 시작하는 특수 이름 뒤에 특정 연산자 기호가 있어야합니다. 예를 들어, 사용자 지정 할당 연산자는operator=라는 함수로 구현할 수 있습니다. 할당 연산자는 일반적으로 왼쪽 피연산자에 대한 참조를 반환해야합니다. 사용자가 복사 할당 연산자를 명시 적으로 정의하지 않으면 컴파일러에서 자동으로 하나를 생성합니다. 생성 된 버전은 클래스에 힙 메모리에 수동으로 할당 된 데이터 멤버가 포함되어 있지 않을 때 매우 유용합니다. 각 요소를 해당 개체 구성원에 할당하여 배열 구성원을 처리 할 수도 있습니다. 그러나 다음 예제 코드와 같이 동적 메모리 데이터 멤버를 처리 할 때 단점이 있습니다.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class Person {
 public:
  Person() {
    name = new string;
    surname = new string;
  };
  Person(string n, string s) {
    name = new string(std::move(n));
    surname = new string(std::move(s));
  }
  Person(Person &p) {
    name = new string(*p.name);
    surname = new string(*p.surname);
  }

  ~Person() {
    delete name;
    delete surname;
  }

  void renamePerson(const string &n, const string &s) {
    name->assign(n);
    surname->assign(s);
  };

  void printPerson() { cout << *name << " " << *surname; }

 private:
  string *name;
  string *surname;
};

int main() {
  Person P1("Buddy", "Rich");
  Person P2 = P1;

  P1.printPerson();
  cout << endl;
  P2.printPerson();
  cout << endl;

  P1.renamePerson("Jay", "Roach");

  P1.printPerson();
  cout << endl;
  P2.printPerson();
  cout << endl;

  Person P3;
  P3 = P1;
  P1.printPerson();
  cout << endl;
  P3.printPerson();
  cout << endl;

  P1.renamePerson("Liam", "White");

  P1.printPerson();
  cout << endl;
  P3.printPerson();
  cout << endl;

  exit(EXIT_SUCCESS);
}

출력:

Buddy Rich
Buddy Rich
Jay Roach
Buddy Rich
Jay Roach
Jay Roach
Liam White
Liam White

위의 코드는copy-constructor만 명시 적으로 정의하므로P1개체 내용이P3개체에 할당 될 때 잘못된 동작이 발생합니다. P1.renamePerson함수에 대한 두 번째 호출은P3개체의 데이터 멤버를 수정해서는 안되지만 수정되었습니다. 이에 대한 해결책은 오버로드 된 할당 연산자, 즉 복사 할당 연산자를 정의하는 것입니다. 다음 코드 조각은 복사 할 수있는Person클래스 버전을 구현하여 동일한 클래스의 두 개체를 올바르게 할당합니다. 그러나 복사 할당 함수의if문은 개체가 자신에게 할당 된 경우에도 연산자가 올바르게 작동 함을 보장합니다.

#include <iostream>
#include <string>
#include <utility>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class Person {
 public:
  Person() {
    name = new string;
    surname = new string;
  };
  Person(string n, string s) {
    name = new string(std::move(n));
    surname = new string(std::move(s));
  }
  Person(Person &p) {
    name = new string(*p.name);
    surname = new string(*p.surname);
  }

  ~Person() {
    delete name;
    delete surname;
  }

  Person &operator=(const Person &p) {
    if (this != &p) {
      *name = *(p.name);
      *surname = *(p.surname);
    }
    return *this;
  }

  void renamePerson(const string &n, const string &s) {
    name->assign(n);
    surname->assign(s);
  };

  void printPerson() { cout << *name << " " << *surname; }

 private:
  string *name;
  string *surname;
};

int main() {
  Person P1("Buddy", "Rich");
  Person P2 = P1;

  P1.printPerson();
  cout << endl;
  P2.printPerson();
  cout << endl;

  P1.renamePerson("Jay", "Roach");

  P1.printPerson();
  cout << endl;
  P2.printPerson();
  cout << endl;

  Person P3;
  P3 = P1;
  P1.printPerson();
  cout << endl;
  P3.printPerson();
  cout << endl;

  P1.renamePerson("Liam", "White");

  P1.printPerson();
  cout << endl;
  P3.printPerson();
  cout << endl;

  exit(EXIT_SUCCESS);
}

출력:

Buddy Rich
Buddy Rich
Jay Roach
Buddy Rich
Jay Roach
Jay Roach
Liam White
Jay Roach
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ Class