Formoat's Open Blog
연산자 오버로딩(Operator Overloading) 본문
연산자 오버로딩
기본적으로 제공하고있는 연산자들[산술, 논리, 관계 등]을 재정의해 함수로서 호출하는 것.
원형은 함수지만 연산자를 이용하듯 호출할 수 있다. (함수 호출방식으로도 사용가능)
원형이 함수이기 떄문에 다중 정의(오버로딩)가 가능하다.
1. 기존에 존재하지 않는 연산자를 사용해 정의하는 것을 불가능하다. (예: **, ?!, # 등)
2. 정적 함수로 만들 경우 다중 정의가 불가능하다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#include "stdafx.h"#include <iostream>using namespace std;class CMyData{public:CMyData(int nParam) : nData(nParam) // 변환 생성자{cout << "CmyData(int)" << endl;}CMyData(const CMyData &&rhs) : nData(rhs.nData) // 이동 생성자{cout << "CmyData(const CmyData&&)" << endl;}operator int(void) // 형변환 연산자{return nData;}CMyData operator+(const CMyData &rhs) // 덧셈 연산자{cout << "operator+" << endl;CMyData tmp(0);tmp.nData = this->nData + rhs.nData;return tmp;}CMyData& operator=(const CMyData &rhs) // 단순대입 연산자{cout << "operator=" << endl;this->nData = rhs.nData;return *this;}bool operator==(const CMyData &rhs) // 관계 연산자{if (nData == rhs.nData) return true;return false;}int operator[](int nIndex) // 배열 연산자{return arrData[nIndex];}int operator++() // 단항증감 연산자(전위){return ++nData;}int operator++(int) // 단항증감 연산자(후위){int nData = nData++;return nData;}private:int nData = 10;int* arrData = nullptr;};int main(){CMyData a(1), b(2), c(3);a = b + c; // 연산자 함수를 이용한 코드cout << a << endl; // 형변환 연산자를 이용해 int로서 출력return 0;}
위 23, 31행 처럼 'operator'라는 키워드를 이용해 연산자 함수를 정의할 수 있다.
또한 사용자 코드에서는 68번 행처럼 연산자를 이용하듯 사용할 수 있다.
68번행의 a = b + c를 풀어서 작성하면 a.operator=( b.operator(c) )가 된다.
※ 주의점
연산자 함수를 사용함에 있어 주의할 점은 이전에 설명한 생성자들과 임시 객체이다.
위 코드만 실행하더라도 68번행에서 b + c 함수 호출시 tmp 객체를 생성해 b + c의 값을
tmp 객체에 넣고 return 문을 통해 tmp객체를 반환할 때 이동 생성자를 호출해 객체를 생성한다.
tmp 객체의 값은 이동 생성자를 통해 생성된 객체에 저장되고, 이후 tmp 객체는 사라진다.
그 다음에 a = 함수를 호출하면서 함수의 인자값으로 이동 생성자 객체를 담게 된다.
이동 생성자 객체는 a 에 본인이 가지고있는 값을 대입한뒤 스코프가 끝나면 소멸하게 된다.
결과적으로 위 코드는 사용자 코드에서 CMyData는 a, b, c 세 개만 선언됬지만,
연산자 함수를 통해 연산을하게 되면서 tmp 객체와 이동 생성자 객체를 생성해 연산을 하게된다.
눈에 보이는 CMyData 객체는 3개지만 실제로는 5개의 CMyData 객체가 사용된다.
'C & C++ > C++ Basic' 카테고리의 다른 글
이동 생성자(Move Constructor) (0) | 2019.09.22 |
---|---|
변환 생성자(Conversion Constructor) (0) | 2019.09.22 |
복사 생성자(Copy Constructor) (0) | 2019.09.22 |
클래스(Class) (0) | 2019.09.21 |
네임 스페이스(Namespace) (0) | 2019.09.21 |