inflearn logo
강의

講義

知識共有

ホン・ジョンモのついていきながら学ぶC++

9.1 算術演算子のオーバーロード

10:59 멤버 함수로서 연산자 오버로딩

358

yahoo

投稿した質問数 18

2

멤버함수로서 연산자 오버로딩을 할 때는 무조건 parameter가 하나이어야 하는거죠? (이게 그냥 rule인걸까요? 이해가 아니라 외워야 하는...)

standalone 함수일 때는 연산자 오버로딩할 때 parameter 갯수 상관없는 것 같은데 맞나요?

c++

回答 2

3

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

네, 그렇습니다.
다만, 이러한 규칙을 단순히 암기하는 것 보다는, 설계의 원리 혹은 동작 방식, 클래스와 인스턴스 간의 상호작용 등을 통해 이해하는 것이 더 중요하다고 생각합니다.

  • 멤버 함수로서의 연산자 오버로딩

    : 이 경우, 해당 연산자 오버로딩 함수는 이미 그 객체가 속한 환경 및 범위 내에서 작동합니다.
    따라서, 이항 연산자인 operator + 을 멤버 함수로 오버로딩의 경우, 함수는 하나의 매개변수에 대한 정보만 알아도 괜찮습니다.
    this 인스턴스가 첫 번째 피연산자(좌항)가 되고, 매개변수는 연산의 두 번째 피연산자(우항)가 됩니다.

  • 비멤버함수 또는 friend 함수로서의 연산자 오버로딩

    : 이 경우, 연산자 함수는 객체의 환경 및 범위 밖에서 작동하므로, 모든 피연산자를 매개변수로 받아야 합니다.


다양한 방식으로 연산자 오버로딩을 실험해보시며 학습하시는 것도 재미있을 것 같습니다. 👍👍

1

yahoo

답변 감사합니다😀

0

deeto3884

이럴 때는 비정형적인 예시를 하나 생각해보세요!

 

물론 논리적인 비약이 많이 섞여있지만, 그래도 저한테는 이해하는데 도움이 조금 되어서 같은 의문을 가지는 다른 분들께도 아주 조금이나마 도움이 되고자 글 남깁니당

 

 

오늘 저녁은 밥과 돼지고기를 먹고싶어요. 근데 저는(함수는) 지금 밖에(클래스 밖에) 있어서 밥도 못하고, 돼지고기도 따로 사야해요.

#include <iostream>
using namespace std;

class Outside
{
public:
    enum Cooking
    {
        RICE = 1,
        PORK,
    };

private:
    Cooking ingredient;

public:
    Outside(const Cooking ingredient)
        : ingredient{ingredient} {}
    
    Outside(const int ingredient)
        : ingredient{Cooking(ingredient)} {}

    Cooking get_ingredient() const {return ingredient;}
};

Outside operator + (Outside& o1, Outside& o2)
{
    return Outside(o1.get_ingredient() + o2.get_ingredient());
}


int main()
{
    Outside rice(Outside::RICE);
    Outside pork(Outside::PORK);

    if(Outside(pork + rice).get_ingredient() == 3)
        cout << "Complete!" << endl;
}

클래스 밖에 있는 함수는 돼지고기도 따로 구하고, 밥도 따로 구해서 식단을 마련해야 해요.

 

 

저는(함수는) 집 안에(클래스 안에) 있어요! 그래서 밥은 그냥 여기서 지으면 되고, 돼지고기만 구입하면 돼요!

#include <iostream>
using namespace std;

class Home
{
public:
    enum Cooking
    {
        RICE = 1,
        PORK,
    };

private:
    Cooking ingredient;

public:
    Home(const Cooking ingredient)
        : ingredient{ingredient} {}
    
    Home(const int ingredient)
        : ingredient{Cooking(ingredient)} {}

    Cooking get_ingredient() const {return ingredient;}

    Home operator + (Home& o1)
    {
        return Home(this->get_ingredient() + o1.get_ingredient());
    }
};


int main()
{
    Home rice(Home::RICE);
    Home pork(Home::PORK);

    if(Home(pork + rice).get_ingredient() == 3)
        cout << "Complete!" << endl;
}

함수가 클래스 안에 있으면, 밥은 그냥 집 안에 있는걸로 만들고(this), 돼지고기만 따로 구해서 식단으로 만들면 돼요!

 

 

지금 집 안에 있는 애는 제 친구에요. 물론 친하긴 하지만.. 집에 있는 쌀을 함부로 뒤적거리는건 예의가 아니겠죠? 친구가 둘 다 사온대요!

 

#include <iostream>
using namespace std;

class Outside
{
public:
    enum Cooking
    {
        RICE = 1,
        PORK,
    };

private:
    Cooking ingredient;

public:
    Outside(const Cooking ingredient)
        : ingredient{ingredient} {}
    
    Outside(const int ingredient)
        : ingredient{Cooking(ingredient)} {}

    Cooking get_ingredient() const {return ingredient;}

    friend Outside operator + (Outside& o1, Outside& o2)
    {
        return Outside(o1.get_ingredient() + o2.get_ingredient());
    }
};

int main()
{
    Outside rice(Outside::RICE);
    Outside pork(Outside::PORK);

    if(Outside(pork + rice).get_ingredient() == 3)
        cout << "Complete!" << endl;
}

비록 집 안에 있지만, 친구이기 때문에 집 안의 재료를 직접 참고할 순 없고, 쌀과 돼지고기를 직접 구해와야 해요.

 

 

교재 있나요?

1

128

2

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

1

86

3

using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다

1

99

2

cstr직접구현

0

113

3

BubbleSort

1

75

2

숙제 마지막 부분

1

77

2

강의와 똑같이 진행했는데 링킹 에러가 발생합니다.

1

91

2

수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??

1

159

2

공변반환형 관련 문의 드립니다.

1

89

2

170강 유니크 포인터에대해 질문있습니다

1

79

1

섹션 5 퀴즈의 답이 이상합니다

1

83

2

이중포인터와 배열이 이해가 안됩니다.

1

152

2

5분 17~5분 34초 객체 잘림 질문

1

75

1

Resource.h 코드 알려주세요

1

70

1

char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다

1

93

2

화면좌측 숫자 보이기

1

113

1

화면 좌측 숫자 보이기

0

65

1

처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??

1

135

3

46강 string 버퍼 질문입니다

1

80

2

프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.

1

123

2

[] 범위 검사시 assert 사용 관련 질문

1

86

2

Lecture 클래스 멤버변수 명명 관련

0

86

2

프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요

0

71

1

noexcept과 throw()

1

80

2