class Vector
{
private:
float x;
float y;
float z;
public:
Vector(float x, float y, float z):
x(x), y(y), z(z)
{
}
//단항 연산자 -
Vector operator-() const
{
return Vector(-x,-y,-z);
}
//단항 연산자 +
Vector operator+() const
{
return *this;
}
//이항 연산자 +
Vector operator+(const Vector& v) const
{
return Vector(this.x + v.x, this.y + v.y, this.z + v.z);
}
//이항 연산자 -
Vector operator-(const Vector& v) const
{
return Vector(this.x - v.x, this.y - v.y, this.z - v.z);
}
//스칼라 이항 연산자 *
Vector operator*(float v) const
{
return Vector(this.x * v, this.y * v, this.z * v);
}
//Vector 이항 연산자 * (dot product)
Vector operator*(Vector v) const
{
return this.x * v.x + this.y * v.y + this.z * v.z;
}
//이항 연산자 /
Vector operator/(float v) const
{
return Vector(this.x / v, this.y / v, this.z / v);
}
//전위 연산자 --
Vector& operator--()
{
--x;
--y;
--z;
return *this;
}
//전위 연산자 ++
Vector& operator++()
{
++x;
++y;
++z;
return *this;
}
//후위 연산자 ++
Vector& operator++(int)
{
Vector temp = *this;
++(*this);
return temp;
}
friend Vector operator*(float v1, const Vector& v2);
//후위 연산자 --
Vector& operator--(int)
{
Vector temp = *this;
--(*this);
return temp;
}
}
Vector operator*(float v1, const Vector& v2)
{
return Vector(v2.x * v1, v2.y * v1, v3.z * v1);
}
int main()
{
const Vector v1(1,1,1);
const Vector v2(2,2,2);
Vector v3 = +v1;
Vector v4 = -v1;
Vector v5 = ++v3;
Vector v6 = --v4;
Vector v7 = v1++;
Vector v8 = v1--;
Vector v9 = v1 + v2;
Vector v10 = v1 - v2;
Vector v11 = v1 * 8.0f;
Vector v12 = v1 / 8.0f;
float v13 = v11 * v12
Vector v14 = 3.0f * v12;
}
구현한 연산자 오버로딩은 사칙 연산을 부분적으로 구현한 것이다.
몇가지 유의사항은 아래와 같다.
1. - 오버로딩 함수
Vector operator-() const
{
return Vector(-x,-y,-z);
}
- 오버로딩 함수에 const 를 붙이는 이유는 const this 포인터를 사용하기 위함이다. (사용자가 const 객체를 이용할 경우를 대비함)
2. 후위 연산자 오버로딩 함수
//후위 연산자 ++
Vector& operator++(int)
{
Vector temp = *this;
++(*this);
return temp;
}
후위 연산자 오버로딩 함수는 한번의 복사가 필요하다.
3. 만든 객체의 연산자 오버로딩 다른 방법
class Vector
{
//code...
friend Vector operator*(float v1, const Vector& v2);
}
우선 전역에 함수를 정의 하기전에 Vector class의 private으로 숨긴 데이터를 이용하기 위해 friend 키워드로 접근 가능하게 한다.
Vector operator*(float v1, const Vector& v2)
{
return Vector(v2.x * v1, v2.y * v1, v3.z * v1);
}
전역으로 위와같이 함수를 구현하면 아래와 같이 순서를 바꿔서도 만들 수 있다. (but 코드구조가 별로 인듯..)
Vector v14 = 3.0f * v12;
쿠키 코딩 끝!
'Program > C,C++' 카테고리의 다른 글
멤버 함수 포인터 (0) | 2023.06.28 |
---|---|
const 멤버 함수 (0) | 2023.06.28 |
this 포인터를 이용한 빌더 패턴 (0) | 2023.06.26 |
Class 전방 선언 (0) | 2023.06.26 |