본문 바로가기
Programming/C C++

C++ 오버로딩과 연산자 오버로딩

by whitele 2021. 3. 20.
반응형

오버로딩

C에서 C++ 넘어오면서 생긴 기능중 하나이다. 함수를 같은 이름응로 비슷한 기능임에도 불구하고 C언어에서는 이름을 다르게 해야한다. C언어에서는 동일한 이름의 함수가 정의되어 있으면 컴파일러가 오류를 발생시킨다.

//error_overload.c
#include <stdio.h>
void func(int n);
void func(int n,int e);
int main()
{
        func(1);
        func(2,3);
        return 0;
}
void func(int n){
        printf("%d\n",n);
}
void func(int n,int e){
        printf("%d %d\n",n,e);
}

에러 예제

위 사진처럼 C언어는 에러를 발생시킨다. 

C++은 함수 호출 시 전달되는 인자를 통해서 함수를 구분하기 때문에 인수 형태가 다르다면 동일한 이름의 함수 정의가 가능하다.

int func(char c);
int func(int n);
int func(int n);
int func(int n1,int n2);

위 처럼 자료형이 다르거나 매개변수의 개수가 다르면 함수 오버로딩이 가능하다. 전혀 어려운 개념이 아니다.

오버로딩은 정말 편하고 좋은 기능이지만 그만큼 주의를 가져야한다. 너무 남발적이어도 좋지 않고 정말 엉뚱하게 기능을 구현해도 좋지않다. 

연산자 오버로딩

연산자도 오버로딩이 가능하다. 연산자 오버로딩을 통해 다양한 기능을 구현할 수 있다. 객체와 객체를 연산을 하는 것처럼 표현하여도 미리 정의한 오버로딩을 통해 객체의 멤버끼리 연산을 가능하게 한다.

연산자 오버로딩의 두가지 방법

  • 멤버함수 오버로딩
  • 전역함수 오버로딩
ins1+ins2

ins1.operator+(ins2);//멤버 오버로딩
operator+(ins1,ins2);//전역 오버로딩
//전역함수 오버로딩
#include <iostream>
using namespace std;

class Point{
private:
    int x;
    int y;
public:
	Point(int xp=0,int yp=0):x(xp),y(yp){}
    void printposition() const{
    	cout<<'['<<x<<','<<y<<']'<<endl;
    }
    friend Point operator+(const Point &p1,const Point &p2);
};
Point operator+(const Point &p1,const Point &p2){
	Point position(p1.x+p2.x,p1.y+p2.y);
    return position;
}
int main()
{
	Point pos1(1,1);
    Point pos2(10, 10);
    Point pos3=pos1+pos2;
    
    pos1.printposition();
    pos2.printposition();
    pos3.printposition();
    
    return 0;
}

단항 연산자

단항 연산자 ++,--역시 멤버함수 오버로딩과 전역함수 오버로딩으로 나뉘어져 있다.

++pos;

pos.operator++();//멤버
operator++(pos);//전역

그런데 ++,--는 전위와 후위를 구분해야한다. 구분하기 위해서 다음과 같이 구분한다.

++pos=pos.operator++();
pos++=pos.operator++(int);

위 예시 처럼 int 키워드를 통해 전위와 후위를 구분한다.

 

연산자 오버로딩에는 ( )연산자 오버로딩 [ ] 배열 인덱스 연산자 오버로딩, new, delete 연산자 오버로딩, 타입 변환 연산자 오버로딩등이 있다.

728x90
반응형

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

C++ STL Set 컨테이너,멤버 함수 사용  (2) 2021.06.05
C++ STL List 컨테이너  (0) 2021.06.01
C++ STL Deque 컨테이너  (0) 2021.05.27
C++ STL Vector 컨테이너  (0) 2021.05.24
[c/c++] 구조체, 공용체 struct, union  (0) 2021.05.02

댓글