C++ 오버로드된 연산자 및 오버로드된 함수


C++에서는 동일한 범위의 특정 함수연산자에 대해 여러 정의를 지정할 수 있습니다. 이를 각각 함수 오버로딩연산자 오버로딩이라고 합니다.

오버로드된 선언이란 이전에 이 범위에 선언된 함수나 메서드와 이름은 동일하지만 매개변수 목록과 정의(구현)가 다른 선언을 말합니다.

오버로드된 함수 또는 오버로드된 연산자를 호출하면 컴파일러는 사용하는 매개변수 유형과 정의의 매개변수 유형을 비교하여 가장 적절한 정의를 사용하기로 결정합니다. 가장 적절한 오버로드 함수나 연산자를 선택하는 과정을 오버로드 결정이라고 합니다.

C++의 함수 오버로딩

동일한 범위에서 유사한 함수로 동일한 이름의 여러 함수를 선언할 수 있지만, 동일한 이름을 가진 이러한 함수의 형식 매개변수(매개변수의 수, 유형 또는 순서 참조)는 반드시 달라져라. 단순히 반환 유형을 다르게 해서 함수를 오버로드할 수는 없습니다.

다음 예에서는 같은 이름의 함수 print()를 사용하여 다양한 데이터 유형을 출력합니다.

#include <iostream>
using namespace std;
 
class printData 
{
   public:
      void print(int i) {
        cout << "Printing int: " << i << endl;
      }

      void print(double  f) {
        cout << "Printing float: " << f << endl;
      }

      void print(char* c) {
        cout << "Printing character: " << c << endl;
      }
};

int main(void)
{
   printData pd;
 
   // Call print to print integer
   pd.print(5);
   // Call print to print float
   pd.print(500.263);
   // Call print to print character
   pd.print("Hello C++");
 
   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Printing int: 5
Printing float: 500.263
Printing character: Hello C++

연산자 오버로딩 C++에서

대부분의 C++ 내장 연산자를 재정의하거나 오버로드할 수 있습니다. 이를 통해 사용자 정의 유형의 연산자를 사용할 수 있습니다.

오버로드된 연산자는 특수한 이름을 가진 함수입니다. 함수 이름은 키워드 연산자와 오버로드할 연산자 기호로 구성됩니다. 다른 함수와 마찬가지로 오버로드된 연산자에는 반환 유형과 매개변수 목록이 있습니다.

Box operator+(const Box&);

두 개의 Box 객체를 추가하고 최종 Box 객체를 반환하는 데 더하기 연산자가 사용된다고 선언합니다. 대부분의 오버로드된 연산자는 일반 비멤버 함수 또는 클래스 멤버 함수로 정의될 수 있습니다. 위 함수를 클래스의 비멤버 함수로 정의하는 경우 아래와 같이 각 작업에 대해 두 개의 매개 변수를 전달해야 합니다.

Box operator+(const Box&, const Box&);

다음 예에서는 멤버 함수를 사용한 연산자 오버로드의 개념을 보여줍니다. 여기서 객체는 매개변수로 전달되고 객체의 속성은 아래와 같이 this 연산자를 사용하여 액세스됩니다.

#include <iostream>
using namespace std;

class Box
{
   public:

      double getVolume(void)
      {
         return length * breadth * height;
      }
      void setLength( double len )
      {
          length = len;
      }

      void setBreadth( double bre )
      {
          breadth = bre;
      }

      void setHeight( double hei )
      {
          height = hei;
      }
      // 重载 + 运算符,用于把两个 Box 对象相加
      Box operator+(const Box& b)
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};
// 程序的主函数
int main( )
{
   Box Box1;                // 声明 Box1,类型为 Box
   Box Box2;                // 声明 Box2,类型为 Box
   Box Box3;                // 声明 Box3,类型为 Box
   double volume = 0.0;     // 把体积存储在该变量中
 
   // Box1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // Box2 详述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // Box1 的体积
   volume = Box1.getVolume();
   cout << "Volume of Box1 : " << volume <<endl;
 
   // Box2 的体积
   volume = Box2.getVolume();
   cout << "Volume of Box2 : " << volume <<endl;

   // 把两个对象相加,得到 Box3
   Box3 = Box1 + Box2;

   // Box3 的体积
   volume = Box3.getVolume();
   cout << "Volume of Box3 : " << volume <<endl;

   return 0;
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

오버로드 가능 연산자 /오버로드 불가능한 연산자

오버로드 가능한 연산자 목록은 다음과 같습니다.

[]삭제 삭제 []::.*.?:

연산자 오버로딩의 예

오버로드의 개념을 더 잘 이해하는 데 도움이 되도록 다양한 연산자 오버로딩의 예가 아래에 제공됩니다.

+-*/%^
&| ~! ,=
<><=>=++--
<< > ;> | = *=<<=>>=
()->->
다음은 오버로드할 수 없는 연산자 목록입니다.
주문 연산자 및 인스턴스
1단항 연산자 오버로드
2이진 연산자 오버로드
3 관계 연산자 오버로딩
4 입력/ 출력 연산자 오버로딩
5++ 및 -- 연산자 오버로딩
6대입 연산자 오버로딩
7함수 호출 연산자() 오버로딩
8 아래첨자 연산자[ ] 오버로드
9클래스 멤버 액세스 연산자-> 오버로드