C++ Chapter 9.4 : 단항 연산자 오버로딩

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 9. 연산자 오버로딩 : 단항 연산자 오버로딩

단항 연산자 : +, -, !

추가적인 설명은 이전 포스트인 9.1 연산자 오버로딩 시작하기 참고하기

🔔 전역 함수로 구현하기

private멤버를 자유롭게 사용하려면 friend 지정해주기

#include <iostream>
using namespace std;

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents = 0) { m_cents = cents; }

	friend std::ostream& operator << (std::ostream &out, const Cents &cents)
	{
		out << cents.m_cents;
		return out;
	}

    friend Cents operator - (const Cents& c) // 👈 `-` 연산자 오버로딩 friend 지정👈
    {
	    return Cents(-c.m_cents);
    }
};


int main()
{
	Cents cents1(6);

	cout << cents1 << endl;   // 6 출력 
	cout << -cents1 << endl;  // -6 출력
	cout << -Cents(-10) << endl;  // 10 출력  (익명 객체)

    cout << cents1 << endl;   // 6 출력 

	return 0;
}

- 연산자를 오버로딩 하였다.

  • 단항 연산자는 피연산자를 1개 필요로 한다.
    • 전역 함수로 구현하니 인수 1개를 받아야 한다.
  • 구현한 -연산자 오버로딩은 Cents 타입의 멤버변수 m_data-를 붙여 이 멤버 값을 가진 Cents 타입의 객체를 리턴하고 있다.
  • 출력 연산자 오버로딩이 되어 있으므로 그냥 cout « cents1 만 해주어도 해당 객체의 m_data 값이 출력된다.
  • return Cents(-c.m_cents); 금방 사라질 Cents 타입의 익명 객체를 리턴한 것일 뿐이다.
    • 연산 후 cents1의 멤버 값에는 변화가 없다.
  • 전역 함수이므로 뒤에 const가 붙을 수 없다. 참고 포스트
    Cents operator - (const Cents& c) const // 👈 💥에러💥
    {
      return Cents(-c.m_cents);
    }
    


🔔 멤버 함수로 구현하기

#include <iostream>
using namespace std;

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents = 0) { m_cents = cents; }
	int getCents() const { return m_cents; }
	int& getCetns() { return m_cents; }

	bool operator ! () const  
	{
		return (m_cents == 0) ? true : false;
	}

	friend std::ostream& operator << (std::ostream &out, const Cents &cents)
	{
		out << cents.m_cents;
		return out;
	}
};

int main()
{
	Cents cents2(0);

	cout << !cents2 << endl;  // 1 출력 (m_cents가 0이라 true니까!)

	return 0;
}
bool operator ! () const  
{
	return (m_cents == 0) ? true : false;
}

! 연산자를 오버로딩 하였다.

  • 단항 연산자는 피연산자를 1개 필요로 한다.
    • 멤버 함수로 구현하니 인수를 받을 필요가 없다.
      • 호출하는 자기 자신(Cents타입 객체)이 곧 피연산자가 되기 때문
  • 구현한 -연산자 오버로딩은 Cents 타입의 멤버변수 m_data-를 붙여 이 멤버 값을 가진 Cents 타입의 객체를 리턴하고 있다.
  • 뒤에 const를 붙여 멤버 값을 변경시키지 않겠다는 뜻을 내비추고 있다!
    • 참고 포스트
      • const객체는 const가 붙은 멤버 함수 호출할 수 있고
      • 일반 객체는 그런거 상관 없이 const가 붙은 멤버 함수 호출할 수 있다.
      • 뒤에 const가 붙을 수 있는건 멤버 함수만 가능하다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Cpp 카테고리 내 다른 글 보러가기

댓글 남기기