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

+ Recent posts