728x90

C++ 연산자 오버로딩 이라는 개념은 생소하다. 왜냐하면 Java, C# 에서는 들어본 적이 없다.


C++ 자료형은 int, float, double, char 등이 존재하고 사칙 연산이 가능하다.

사용자 정의 자료형에는 구조체(struct) 와 클래스가 있다.

C언어에서는 구조체는 사칙 연산이 불가능하다. C언어에서는 클래스는 없다.

C++ 에서 클래스에서 생성한 객체끼리 사칙 연산이 가능하도록 만들어 놓은 것이 연산자 오버로딩이다.

연산자 오버로딩은 operator 라는 함수명을 사용하며 뒤에 사칙연산자( +, -, *, / )가 붙는다.


#include <iostream>
using namespace std;

class Point {
private:
    int x, y;
public:
    Point(int _x=0, int _y=0) : x(_x), y(_y){}
    void ShowPosition();
    Point operator+(const Point& p);
    bool operator==(const Point& p);
    Point operator-(const Point& p);
    friend bool operator!=(const Point&, const Point&); // friend 선언
    // Point 클래스 입장에서 다른 클래스 또는 전역 함수를 자신의 친구로 선언하는 것
    // 전역 함수 operator 에게 private 및 protected 멤버에 접근할 수 있는 권한을 부여
    // friend 는 정보 은닉에 위배되는 개념
    // 연산자 오버로딩에서 유용하게 사용
    friend Point& operator--(Point& p);
};


void Point::ShowPosition() {
    cout << "(" << x << ", " << y << ")" << endl;
}

// 멤버 함수 기반의 연산자 오버로딩
Point Point::operator+(const Point& p) { // 매개변수 상수화
    // const 란 정의된 변수를 상수화하여, 그 값을 변경하지 못하게 하는 것이다.
    // 값 변경의 위험이 느껴질 때, 매개변수 앞에 const 를 붙여 상수화 시키는 것이다.
    return Point(x + p.x, y + p.y);
}

bool Point::operator==(const Point& p) {
    if (x == p.x && y == p.y) return true;
    else return false;
}

Point Point::operator-(const Point& p) {
    return Point(x - p.x, y - p.y);
}


bool operator!=(const Point& p1, const Point& p2){ // 전역 함수
    // Point 클래스의 private 영역 접근 가능
    // friend 로 선언된 대상에게는 완벽하게 public 으로 작용한다.
    return (p1 != p2);
}


Point& operator--(Point& p) { //전역함수 
    p.x--;
    p.y--;
    return p;
}


int main() {
    Point p1(1, 6); // 객체가 생성될 때 메모리가 할당된다.
    Point p2(2, 4);
    Point p3 = p1.operator+(p2);
    //Point p3 = p1 + p2;
    Point p4 = p3 - p2; // Point p4 = p3 - p2 + p1; 로 해봐도 결과가 나오는 걸 확인 할 수 있다.

    p1.ShowPosition();
    p2.ShowPosition();
    p3.ShowPosition();
    p4.ShowPosition();


    --p2;
    p2.ShowPosition();
} 


Point p3 = p1 + p2; 에서 p1, p2는 객체이므로 기본적으로 + 연산이 불가능하다.

앞에 operator 라는 키워드를 붙여서 p1과 p2를 이용해서 operator +라는 함수를 호출해주게 되는 것이다.

p1.operator+(p2); 로 operator 함수가 호출되어 수행하도록 약속되어 있다.



테스트에 사용한 파일

c++operator.cpp


728x90

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

C++ 얕은 복사, 깊은 복사(Shallow Copy vs. Deep Copy)  (0) 2019.11.27
C++ 복사 생성자  (0) 2019.11.27
C++ static  (0) 2019.11.25
C++ 클래스 이해  (0) 2019.11.23
C++ namespace(네임스페이스)  (0) 2019.11.22
블로그 이미지

Link2Me

,