잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

연산자 오버로딩 예제 본문

Study/C++

연산자 오버로딩 예제

현록 2019. 5. 21. 23:54

연산자 오버로드

https://docs.microsoft.com/ko-kr/cpp/cpp/operator-overloading?view=vs-2019

증가 및 감소 연산자 오버로드

https://docs.microsoft.com/ko-kr/cpp/cpp/increment-and-decrement-operator-overloading-cpp?view=vs-2019

 

 


 

연산자를 사이에 두고 피연산자가 1개면 단항연산자, 2개면 이항연산자.

 

[단항연산자일 경우]  (연산자)(피연산자) or (피연산자)(연산자)

friend: 신경쓰지 않음. 어차피 피연산자가 1개라면 무조건 해당 클래스일테니.

return type: 대상이 피연산자 자신?

 맞으면 참조형(Vector&)으로 자신(*this) /

 아니면 일반클래스(Vector)로 새로 만든 개체를 반환.

자체 const: 피연산자에 변경이 가해지면 X / 변경 없으면 O.

+증감연산자라면:

 전위연산이라면 매개변수가 없고 /

 후위연산이라면 (int)로 이름없는 int형 하나 넣기로 약속.

 

[이항연산자일 경우]  (피연산자1)(연산자)(피연산자2)

friend: 피연산자1이 본 클래스라면 X. 피연산자1이 접근불가면 friend O로 전역함수화.

return type: 대상이 피연산자 중 하나?

 맞으면 참조형(Vector&)으로 그 피연산자(*this or rhs) /

 아니면 일반클래스(Vector)로 새로 만든 개체를 반환.

자체 const: 피연산자1에 변경이 가해지면 X / 변경 없으면 O.

매개변수 const: 피연산자2(매개변수)에 변경이 가해지면 X / 변경 없으면 O.

 


단항(unary)
++v1;

ㆍ연산자(++)를 사이에 두고 피연산자가 1개 = 단항연산자.

ㆍ피연산자가 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 자신? 맞음 = 반환형 참조형(Vector&).

 (피연산자를 증가시키고, 그 증가시킨 피연산자 본인을 반환)

ㆍ피연산자에 변경이 가해지나? 맞음 = 함수 자체 const X.

+전위연산인가? 맞음 = 매개변수 없음.

Vector& operator++();

Vector& Vector::operator++()
{
    mX++;
    mY++;
    return *this;
}


단항(unary)
v1--;

ㆍ연산자(--)를 사이에 두고 피연산자가 1개 = 단항연산자.

ㆍ피연산자가 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 자신? 아님 = 반환형 클래스자체(Vector).

 (반환은 피연산자의 복제본을 반환하되, 그 사이에 피연산자에는 몰래 연산을 해둠. 이러면 결과적으로 후위연산.)

ㆍ피연산자에 변경이 가해지나? 맞음 = 함수 자체 const X.

+전위연산인가? 아님 = 매개변수 int.

 (※ 아마 오버로딩 조건(매개변수 종류가 달라야 함) 충족을 위해. 마치 이항연산자마냥. 후위연산을 int로 약속함)

Vector operator--(int);

Vector Vector::operator--(int)
{
    Vector result(mX, mY);
    --(*this);
    return result;
}

 

단항(unary) 
Vector v1 = -v2; 

ㆍ연산자(-)를 사이에 두고 피연산자가 1개 = 단항연산자.

ㆍ피연산자가 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 자신? 아님 = 반환형 클래스자체(Vector).

 (v2는 그대로 존재하고, 내용물이 반전된 새로운 Vector가 생길 것.)

ㆍ피연산자에 변경이 가해지나? 아님 = 함수 자체 const O.

+전위연산인가? 증감연산자가 아님 = 매개변수 없음.

Vector operator-() const;

Vector Vector::operator-() const
{
    Vector result(mX * -1, mY * -1);
    return result;
}

 


이항(binary)
Vector v1 = v2 + v3;

ㆍ연산자(+)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나? 아님 = 반환형 클래스자체(Vector).

 (v2와 v3는 그대로 존재하고, 둘의 값이 합쳐진 내용물을 가진 새로운 Vector가 생길 것.)

ㆍ피연산자1에 변경이 가해지나? 아님 = 함수 자체 const O.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

Vector operator+(const Vector& rhs) const;

Vector Vector::operator+(const Vector& rhs) const
{
    Vector result(mX, mY);
    result.mX = mX + rhs.mX;
    result.mY = mY + rhs.mY;
    return result;
}


이항(binary)
Vector v1 = v2;

ㆍ연산자(=)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나? 맞음 = 반환형 참조형(Vector&).

 (v1의 내용물이 v2의 내용물과 같아질 뿐.)

ㆍ피연산자1에 변경이 가해지나? 맞음 = 함수 자체 const X.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

Vector& operator=(const Vector& rhs);

Vector& Vector::operator=(const Vector& rhs)
{
    if(this == &rhs)
    {
        return *this;
    }
    mX = rhs.mX;
    mY = rhs.mY;
    return *this;
}


이항(binary)
Vector v1 += v2;

ㆍ연산자(+=)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나? 맞음 = 반환형 참조형(Vector&).

 (v1의 내용물에 v2의 내용물 값이 더해질 뿐.)

ㆍ피연산자1에 변경이 가해지나? 맞음 = 함수 자체 const X.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

Vector& operator+=(const Vector& rhs);

Vector& Vector::operator+=(const Vector& rhs)
{
    mX += rhs.mX;
    mY += rhs.mY;
    return *this;
}


이항(binary)
Vector v1 *= 2;

ㆍ연산자(*=)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나? 맞음 = 반환형 참조형(Vector&).

 (v1의 내용물에 v2의 내용물 값이 곱해질 뿐.)

ㆍ피연산자1에 변경이 가해지나? 맞음 = 함수 자체 const X.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O. (※ 원시형(값)이므로 무시)

Vector& operator*=(int multiplier);

Vector& Vector::operator*=(int multiplier)
{
    mX *= multiplier;
    mY *= multiplier;
    return *this;
}


이항(binary)
if (v1 == v2) {}

ㆍ연산자(==)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나? 아예 다른 형.

ㆍ피연산자1에 변경이 가해지나? 아님 = 함수 자체 const O.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

bool operator==(const Vector& rhs) const;

bool Vector::operator==(const Vector& rhs) const
{
    if(mX == rhs.mX && mY == rhs.mY)
    {
        return true;
    }
    else
    {
        return false;
    }
}


이항(binary)
Vector v1 = v2 * 2;

ㆍ연산자(*)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 맞음 = friend X.

ㆍreturn 대상이 피연산자 중 하나아님 = 반환형 클래스자체(Vector).

 (v2는 그대로 존재하고, v2의 내용물 값에 2가 곱해진 내용물을 가진 새로운 Vector가 생길 것.)

ㆍ피연산자1에 변경이 가해지나? 아님 = 함수 자체 const O.

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

Vector operator*(int multiplier) const;

Vector Vector::operator*(int multiplier) const
{
    Vector result(mX, mY);
    result.mX *= multiplier;
    result.mY *= multiplier;
    return result;
}


이항(binary)
Vector v1 = * v2;

ㆍ연산자(*)를 사이에 두고 피연산자가 2개 = 이항연산자.

ㆍ피연산자1이 본 클래스? 아님 = friend O.

ㆍreturn 대상이 피연산자 중 하나아님 = 반환형 클래스자체(Vector).

 (v2는 그대로 존재하고, v2의 내용물 값에 2가 곱해진 내용물을 가진 새로운 Vector가 생길 것.)

ㆍ피연산자1에 변경이 가해지나? 아님 = 함수 자체 const O. (※ 전역함수이므로 안 함)

ㆍ피연산자2에 변경이 가해지나? 아님 = 매개변수에 const O.

friend Vector operator*(int multiplier, const Vector& rhs);

Vector operator*(int multiplier, const Vector& rhs)
{
    Vector result(rhs.mX, rhs.mY);
    result.mX *= multiplier;
    result.mY *= multiplier;
    return result;
}

선언부에는 friend 키워드.

구현체에는 Vector::operator*가 아닌, 일반 전역함수로서 operator*.

 

 


 

※ 참고사항들

 

Vector a;
Vector b;
a = b;

를 하면 대입연산자(operator=)가 호출되지만,

Vector a = b;

를 하면(개체를 생성과 동시에 operator=사용) 복사생성자(Vector(Vector& rhs))가 호출된다.

C++ 표준상..;;

 

 

'Study > C++' 카테고리의 다른 글

POCU 성적표  (0) 2019.07.29
상속의 형태 따른 메모리 레이아웃  (0) 2019.05.18
Comments

잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→