C & C++/C++

[C++] operator overloading(연산자 오버로딩)

  • -
728x90

operator overloading

하나의 연산자를 여러 의미로 사용할 수 있게 하는 것이다.

C++에서는 연산자 오버로딩을 사용자 정의 타입까지 확장할 수 있으며, 클래스도 하나의 타입임을 확실히 보여준다.

 

operator function(연산자 함수)

C++에서는 연산자를 오버로딩하기 위해서 연산자 함수라는 것을 사용한다.

operator오버로딩할연산자(매개변수 ...)

연산자 함수는 operator 키워드를 사용하여 연산자를 오버로딩한다.

오버로딩할 연산자는 적법한 C++ 연산자이며, operator키워드와 공백 없이 연결되어 표시해야 한다.

 

오버로딩 제약 사항

  • 전혀 새로운 연산자를 정의할 수 없다.
    • ex) 몫을 나타내기 위한 %%라는 연산자를 새롭게 정의할 수 없다
  • 기본 타입을 다루는 연산자의 의미는 재정의할 수 없으며, 따라서 오버로딩된 연산자의 피연산자 중 하나는 반드시 사용자 정의 타입이어야한다.
    • ex) 두 개의 double형에 대한 덧셈 연산자가 뺄셈을 수행하도록 오버로딩할 수 없다
  • 오버로딩된 연산자는 기본 타입을 다루는 경우에 적용되는 피연산자의 수, 우선순위 및 그룹화를 준수해야 한다.
    • ex) 나눗셈 연산자는 이항 연산자이므로 단항 연산자로 오버로딩할 수 없다.
  • 오버로딩된 연산자는 디폴트 인수를 사용할 수 없다.

 

입출력 연산자 오버로딩(<<, >>)

cout << A;

만약 A가 특정 클레스라면, 위 출력되지 않을 것이다. 즉, cout과 A가 같은 타입의 객체라면 가능한 코드이다.

 

cout은 ostream이라는 클래스 형의 오브젝트이다.

 

ostream& operator <<(ostream&, const 클레스이름&);

위와 같이 비멤버 형태로 연산자 오버로딩이 가능하다.

 

예를 들어보자.

 

// 클레스.hpp

class 클래스이름
{
	...
};
...
ostream& operator <<(ostream& outputStream, const 클레스이름& A);
istream& operator >>(istream& inputStream, const 클레스이름& B);

...
// 클레스.cpp

...
ostream& operator <<(ostream& outputStream, const 클래스이름& A)
{
	cout << "(" << A.getValue() <<")";
    return outputStream;
}

istream& operator >>(istream& inputStream, const 클래스이름& B)
{
	int tmp;
    cin >> tmp;
    B.setValue(tmp);
    return inputStream;
}
...

오버로딩한 함수에서 반환값을 보면 istream, ostream 형태이다.

만약 cout << 클레스이름 처럼 불렀을 때 처음 cout이 outputStream에 들어가고 이 값이 레펀스형 반환값으로 다시 리턴되어 연산하게 된다.

728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.