Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
C++ !
http://blog.naver.com/ruvendix
연산자 오버로딩의 필요성
클래스의 접근 함수(액세스 함수)로 필드를 가져오려니까 귀찮다…
클래스도 기본 자료형처럼 연산자에 자유로울 수는 없을까?
그래! 클래스에 맞게 연산자를 오버로딩하자!
연산자도 함수처럼 호출되고 반환 형식이 있으니까!
http://blog.naver.com/ruvendix
연산자와 이름 없는 임시 객체
연산자도 함수라서 호출되고 반환 형식이 있다!
하지만 반환 형식 때문에 이름 없는 임시 객체가 생성된다!
http://blog.naver.com/ruvendix
오버로딩이 불가능한 연산자
위에 있는 것들 말고도 몇 가지 더 존재함!
C++의 문법을 파괴할만한 연산자들은 오버로딩 불가!
각각의 연산자는 오버로딩 규칙이 존재함!
공통적으로 “operator 기호()” 형식을 따름!
http://blog.naver.com/ruvendix
+ 연산자 오버로딩
class CTest
{
int iNum;
const CTest operator +(int iAdd)
{
CTest Temp = iNum + iAdd;
return Temp;
}
};
CTest CTest1, CTest2;
CTest1 + CTest2; // 이게 가능함
+, -, *, /, %는 오버로딩 형식이 동일
http://blog.naver.com/ruvendix
관계 연산자 오버로딩
class CTest
{
int iNum;
bool CTest operator <(const CTest &rTest)
{
return (iNum < rTest.iNum);
}
};
CTest CTest1, CTest2;
CTest1 < CTest2; // 이게 가능함
<, <=, >, >=, == , !=은 오버로딩 형식이 동일
http://blog.naver.com/ruvendix
증감 연산자 오버로딩
class CTest
{
int iNum;
CTest &operator ++(void) // 전위 증가 연산자
{
iNum++;
return *this;
}
CTest operator ++(int) // 후위 증가 연산자
{
CTest Temp = *this;
iNum++;
return Temp;
}
};
전위 증감과
후위 증감은
서로 다름!
http://blog.naver.com/ruvendix
대입 연산자 오버로딩
class CTest
{
int iNum;
CTest &operator =(const CTest &rTest)
{
if (this != &rTest)
{
iNum = rTest.iNum;
}
return *this;
}
};
대입 연산자는 기본 대입 연산자가 있지만!
얕은 복사를 해결하려면 오버로딩해야 함!
대입 연산자는
메서드로만
오버로딩 가능!
복합 대입 연산자는
둘 다 가능!
http://blog.naver.com/ruvendix
배열 첨자 연산자 오버로딩
class CTest
{
int NumList[10];
const int &operator [](const int iIndex)
{
return NumList[iIndex];
}
};
CTest Test;
Test[2];
배열 첨자 연산자를 오버로딩하면
배열이 아닌데도 배열 첨자 연산자 사용 가능!
배열 첨자 연산자는
메서드로만
오버로딩 가능!
http://blog.naver.com/ruvendix
-> 연산자 오버로딩
class CPosition
{
void PrintPosition(void) const;
};
class CTest
{
CPosition Pos;
const CPosition *operator ->(void) const
{
return &Pos;
}
};
CTest Test;
Test->PrintPosition();
-> 연산자를 이용하면 필드에 좀 더 편하게 접근할 수 있음!
-> 연산자는
메서드로만
오버로딩 가능!
http://blog.naver.com/ruvendix
함수 호출 연산자 오버로딩
class CTest
{
int iNum;
const int operator ()(int iAdd)
{
return (iNum + iAdd);
}
};
CTest Test;
Test(10);
함수 호출 연산자를 오버로딩하면 객체를 함수처럼 사용할 수 있음!
그래서 함수 객체(Functor)라고 함!
() 연산자는
메서드로만
오버로딩 가능!
http://blog.naver.com/ruvendix
cout 오버로딩
class CTest
{
friend ostream &operator <<(ostream &rCout, const Ctest &rTest);
int iNum;
};
ostream &operator <<(ostream &rCout, const Ctest &rTest)
{
rCout << rTest.iNum << endl;
return rCout;
}
CTest Test;
cout << Test; // 이게 가능
cout은 오버로딩해서 사용하는 경우가 많음!
cin을 오버로딩할 때는 istream을 이용해야 함!
cout 연산자는
외부 함수로
오버로딩하는 게
편함!
http://blog.naver.com/ruvendix

More Related Content

연산자 오버로딩

  • 2. http://blog.naver.com/ruvendix 연산자 오버로딩의 필요성 클래스의 접근 함수(액세스 함수)로 필드를 가져오려니까 귀찮다… 클래스도 기본 자료형처럼 연산자에 자유로울 수는 없을까? 그래! 클래스에 맞게 연산자를 오버로딩하자! 연산자도 함수처럼 호출되고 반환 형식이 있으니까!
  • 3. http://blog.naver.com/ruvendix 연산자와 이름 없는 임시 객체 연산자도 함수라서 호출되고 반환 형식이 있다! 하지만 반환 형식 때문에 이름 없는 임시 객체가 생성된다!
  • 4. http://blog.naver.com/ruvendix 오버로딩이 불가능한 연산자 위에 있는 것들 말고도 몇 가지 더 존재함! C++의 문법을 파괴할만한 연산자들은 오버로딩 불가! 각각의 연산자는 오버로딩 규칙이 존재함! 공통적으로 “operator 기호()” 형식을 따름!
  • 5. http://blog.naver.com/ruvendix + 연산자 오버로딩 class CTest { int iNum; const CTest operator +(int iAdd) { CTest Temp = iNum + iAdd; return Temp; } }; CTest CTest1, CTest2; CTest1 + CTest2; // 이게 가능함 +, -, *, /, %는 오버로딩 형식이 동일
  • 6. http://blog.naver.com/ruvendix 관계 연산자 오버로딩 class CTest { int iNum; bool CTest operator <(const CTest &rTest) { return (iNum < rTest.iNum); } }; CTest CTest1, CTest2; CTest1 < CTest2; // 이게 가능함 <, <=, >, >=, == , !=은 오버로딩 형식이 동일
  • 7. http://blog.naver.com/ruvendix 증감 연산자 오버로딩 class CTest { int iNum; CTest &operator ++(void) // 전위 증가 연산자 { iNum++; return *this; } CTest operator ++(int) // 후위 증가 연산자 { CTest Temp = *this; iNum++; return Temp; } }; 전위 증감과 후위 증감은 서로 다름!
  • 8. http://blog.naver.com/ruvendix 대입 연산자 오버로딩 class CTest { int iNum; CTest &operator =(const CTest &rTest) { if (this != &rTest) { iNum = rTest.iNum; } return *this; } }; 대입 연산자는 기본 대입 연산자가 있지만! 얕은 복사를 해결하려면 오버로딩해야 함! 대입 연산자는 메서드로만 오버로딩 가능! 복합 대입 연산자는 둘 다 가능!
  • 9. http://blog.naver.com/ruvendix 배열 첨자 연산자 오버로딩 class CTest { int NumList[10]; const int &operator [](const int iIndex) { return NumList[iIndex]; } }; CTest Test; Test[2]; 배열 첨자 연산자를 오버로딩하면 배열이 아닌데도 배열 첨자 연산자 사용 가능! 배열 첨자 연산자는 메서드로만 오버로딩 가능!
  • 10. http://blog.naver.com/ruvendix -> 연산자 오버로딩 class CPosition { void PrintPosition(void) const; }; class CTest { CPosition Pos; const CPosition *operator ->(void) const { return &Pos; } }; CTest Test; Test->PrintPosition(); -> 연산자를 이용하면 필드에 좀 더 편하게 접근할 수 있음! -> 연산자는 메서드로만 오버로딩 가능!
  • 11. http://blog.naver.com/ruvendix 함수 호출 연산자 오버로딩 class CTest { int iNum; const int operator ()(int iAdd) { return (iNum + iAdd); } }; CTest Test; Test(10); 함수 호출 연산자를 오버로딩하면 객체를 함수처럼 사용할 수 있음! 그래서 함수 객체(Functor)라고 함! () 연산자는 메서드로만 오버로딩 가능!
  • 12. http://blog.naver.com/ruvendix cout 오버로딩 class CTest { friend ostream &operator <<(ostream &rCout, const Ctest &rTest); int iNum; }; ostream &operator <<(ostream &rCout, const Ctest &rTest) { rCout << rTest.iNum << endl; return rCout; } CTest Test; cout << Test; // 이게 가능 cout은 오버로딩해서 사용하는 경우가 많음! cin을 오버로딩할 때는 istream을 이용해야 함! cout 연산자는 외부 함수로 오버로딩하는 게 편함!