반응형
반응형

1. 연산자 오버로딩

  1. 연산자 오버로딩시 const를 사용하라!
  2. 연산자 오버로딩 방법 두 가지

1)멤버 함수 오버로딩

  • 구현 : 멤버 함수로 연산자를 오버로딩
Point operator+(const Point& ref);
// 사용시 해석
pos.operator+(pos2);

2)전역 함수 오버로딩

  • 구현 : 전역 함수로 구현하고 클래스 내에서 friend 정의
  • 멤버 변수 접근 안되므로 getter 또는 friend 필요!
// 클래스 내부에서 정의
friend Point operator+(Point&, Point&);
// 클래스 밖에서 전역 함수 구현
Point operator+(Point& pos1, Point& pos2){}
// 사용시 해석
operator+(pos1, pos2);
  1. 무조건 전역 함수 오버로딩을 사용하는 경우

    • 이항 연산의 왼쪽항이 오버로딩 객체가 아닐 때 사용

    • Point 객체에 상수 3을 곱할 경우

Point operator*(int, Point&);

//사용
Point pos2 = pos * 3;
  1. 객체를 cout 가능하게 하기
    • ostream을 전역 함수 오버로딩 사용
ostream& operator<<(ostream& os, Point& pos){
    os <<'('<< x << ',' << y << ')' << endl;
    return os;
}
  1. 연산자 오버로딩 시 주의 사항
    • Animal 클래스(부모) 에서 연산자 오버로딩
    • Cat 클래스(자식)에서 연산자 오버로딩 안함
    • 위의 상태에서 연산자 오버로딩 사용시 문제 발생 가능
if (Cat1 == Cat2)
// 서로 다른 객체 이지만 부모가 동일하여 True발생 가능함
// Cat에도 연산자 오버로딩을 작성해야 함!

2. 단항 연산자 오버로딩(++)

  1. 전위 증가
const Point& operator++(){
    m_nX++;
    m_nY++;
    return *this;
}
++pos1;
  1. 후위 증가
const Point operator++(int){
    const Point refPos(m_nX, m_nY);
    m_nX += 1;
    m_nY += 2;
    return refPos;
}
pos1++;

3. 대입 연산자 오버로딩

  1. 이미 생성 및 초기화 되었으면 = 기호 사용시 대입 연산자 호출됨
  2. 대입 연산자 미구현 시 Defualt 대입 연산자 생성 및 호출
    • 얕은 복사 진행
  3. 상속 시 부모 클래스의 대입연산자를 명시적으로 호출 필요
First::operator=(ref);

4. new, delete 오버로딩

  1. new 연산자 오버로딩
    • new 연산자의 수행 범위 3가지
      • 메모리 할당
      • 생성자 호출
      • 할당 자료형 변환
    • 위 중 메모리 할당 역할만 오버로딩 가능
  2. new, delete 오버로딩 함수는 static 함수
    • 일반 함수로 선언해도 static 함수로 간주
    • 객체 생성 전 호출되어야되는 함수이기 때문
  3. 구현 방법
//new
void* operator new(size_t size) {...}
void* operator new[](size_t size()) {
    void* adr = new char[size];
    return adr;
}

//delete
void operator delete(void* adr)
void operator delete[](void* adr){
    delete[] adr;
}

5. 포인터 연산자 오버로딩

  1. 포인터 연산자 오버로딩
Number& operator*(){
    return *this;
  1. 지시 연산자 오버로딩
Number* operator->(){
    return this;
}

6. 함수 호출 연산자 오버로딩

struct FuncObj{
   int Add()(int a, int b) const{
      return a + b;
   }
}

int main(){
   FuncObj add;
   std::cout<<add(10,20);
}

7. 배열 인덱스 연산자 오버로딩

  1. 값 조회용 오버로딩
int operator[](int idx) const{
   return arr[idx];
}
  1. 값 입력용 오버로딩
int& operator[](int idx) {
   return add[idx];
}

8. 일반 변수 오버로딩

operator int(){
   return x;
}

int main(){
   Point pos(3,2);
   int a = pos; // a는 3을 가짐
}
반응형

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

[C++]스마트 포인터  (0) 2021.03.09
[C++]LR value 및 최적화  (0) 2021.03.09
[C++]빌드 프로세스  (0) 2021.03.09
[C++]메모리 구조  (0) 2021.03.09
[C++]기초 내용 정리  (0) 2021.03.09

+ Recent posts

반응형