Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

연산자 오버로딩(Operator Overloading) 본문

C & C++/C++ Basic

연산자 오버로딩(Operator Overloading)

snd-snd 2019. 9. 22. 23:44

연산자 오버로딩

 

기본적으로 제공하고있는 연산자들[산술, 논리, 관계 등]을 재정의해 함수로서 호출하는 것.

원형은 함수지만 연산자를 이용하듯 호출할 수 있다. (함수 호출방식으로도 사용가능)

원형이 함수이기 떄문에 다중 정의(오버로딩)가 가능하다.

 

1. 기존에 존재하지 않는 연산자를 사용해 정의하는 것을 불가능하다. (예: **, ?!, # 등)

2. 정적 함수로 만들 경우 다중 정의가 불가능하다.

 

#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
Comments