C++ 프로그래밍: 연산자 오버로딩

연산자 오버로딩은 C++ 프로그래밍의 특수 기능 중 하나입니다. 이 기능의 장점은 사용자 지정 데이터 구조에 논리적으로 적합한 연산자를 적용할 수 있다는 것입니다. 실제 응용 프로그램에서 어떻게 사용할 수 있는지 살펴보겠습니다.

연산자 오버로딩의 첫 번째 사용을 살펴보면 터미널에 값을 인쇄하기 위해 오버로드된 연산자std::cout를 사용하여 <<에서 이를 볼 수 있습니다. 다음과 같이 사용됩니다.

int main() {
  std::cout << "Hello, World!\n";
  //        ^^ <-- This is the overloaded operator
}


이것은 사소한 것입니다, 그렇죠? 우리 대부분은 별 생각 없이 이 연산자를 사용하지만 자신의 클래스에 대해 이 연산자를 오버로드하면 사용자 정의 클래스를 인쇄할 수 있다는 점std::cout이 충분히 중요합니다.

실제 사례




class CustomVector {
  float x;
  float y;
public:
  explicit CustomVector(float x, float y) : x(x), y(y) {}

  bool operator==(const CustomVector &vec) const {
    return this->x == vec.x && this->y == vec.y;
  }

  CustomVector operator+(const CustomVector &vec) const {
    return CustomVector(this->x + vec.x, this->y + vec.y);
  }
// ...
};


그래서 여기서 실제로 무슨 일이 일어나고 있는지 분석해 봅시다. CustomVector라는 클래스가 있고 여기에 xy 값을 부여합니다. 이제 이것으로 무엇을 할까요? 우리는 항상 그들의 x 값을 지속적으로 비교하고 싶지 않기 때문에 대신 우리가 하는 일은 == 연산자가 우리를 위해 이것을 할 수 있도록 연산자 오버로드에서 생성하는 것입니다.

연산자 함수를 작성하는 것은 operator 뒤에 오버로드할 유효한 연산자가 오는 함수 이름의 차이점을 사용하여 일반 함수를 작성하는 것만큼 간단합니다. 실제로 C++에서는 newdelete 키워드도 오버로드할 수 있지만 일반적으로 권장되지는 않습니다.

연산자 적용 및 std::cout 사용


+ 연산자를 구현한 후 다음 행을 추가할 수 있습니다.

friend std::ostream& operator<<(std::ostream& s, const CustomVector &vec);


friend 함수나 클래스가 무엇인지 모르는 경우 함수와 클래스가 주어진 클래스의 개인 변수에 액세스할 수 있습니다.

마지막으로 구현을 추가할 수 있습니다.

std::ostream& operator<<(std::ostream& s, const CustomVector &vec) {
  s << "{ x: " << vec.x << ", " << "y: " << vec.y << " }";
  return s;
}


매개변수에 대한 간략한 개요는 출력 스트림의 순간과 사용자 정의 클래스의 인스턴스를 취하는 것을 보여줍니다. 그렇게 나쁘지 않죠?

결과 확인



이제 코드가 실제로 작동하는지 테스트해 보겠습니다.

int main() {
  CustomVector vec = CustomVector(1.0f, 1.0f);
  CustomVector vec2 = CustomVector(2.0f, 2.0f);

  if (vec == vec2) {
    std::cout << "They are equal\n";
  } else {
    std::cout << "They are not equal\n";
  }

  std::cout << "Vec 1: " << vec << "\n";
  std::cout << "Vec 2: " << vec2 << "\n";
  std::cout << "Vec 3: " << vec + vec2 << "\n";

  return 0;
}


코드를 실행할 때 표시되는 내용은 다음과 같습니다.

이것을 가지고 놀면 더 잘 알 수 있습니다here.

결론



연산자 오버로딩은 때때로 혼란스러울 수 있으므로 이 개념을 사용할 때는 천천히 하는 것이 가장 좋습니다. 혼란스러운 코드를 작성하지 않도록 적절하게 사용하고 작성하는 클래스에 유연성을 허용하는지 확인하십시오. C++의 많은 것들과 마찬가지로 프로그래밍할 때 발에 총을 쏘기 쉬우므로 주의하십시오. 오늘 이 개요에서 뭔가를 배웠기를 바랍니다. :)

좋은 웹페이지 즐겨찾기