잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록
현록의 기록저장소
연산자 오버로딩 예제 본문
연산자 오버로드
https://docs.microsoft.com/ko-kr/cpp/cpp/operator-overloading?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 = 2 * 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 |
잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).
여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.
감사합니다. -현록