http://ask.nate.com/qna/view.html?n=5270697
출처 : 본인의 글입니다
11
down vote accepted
|
From the manual:
$(error Bad svn version v1.4, please install v1.6)
This
will result make to a fatal error:
$ make
Makefile:2: *** Bad svn version v1.4, please install v1.6. Stop. |
class Time { .... const Time operator +(const Time &T) const { .... } }; ... C=A.operator +(B); // C=A+B; 와 같다.클래스의 연산자 함수를 정의하는 방법은 다음 두가지가 있다.
const Complex operator +(const Complex &T) const { Complex R(real+T.real, image+T.image); return R; } const Complex operator +(const Complex &T) const { return Complex(real+T.real, image+T.image); }이 코드는 앞서 만든 코드보다 훨씬 더 짧고 간략해 보일 뿐만 아니라 컴파일러의 리턴값 최적화(Retrun Value Optimization) 기능의 도움도 받을 수 있어 훨씬 더 유리하다. 제대로 만든 컴파일러는 호출원의 대입되는 좌변에 대해 곧바로 생성자를 호출하며 불필요한 임시 객체를 만들지 않음으로써 훨씬 더 작고 빠른 코드를 생성한다.
enum origin { EAST, WEST, SOUTH, NORTH }; origin &operator++(origin &o) { if (o == NORTH) { o = EAST; } else { o=origin(o+1); } return o; }객체와 기본형의 연산
class Time { // friend const Time operator +(int s, const Time &T); // int+T friend 생략 가능하다.. 하지만 여전히 Time 클래스와 연결되어있으므로 friend로 묶여 있어도 무방. const Time operator +(int s) const; // T+int .... }; const Time Time::operator +(int s) const { // 멤버 .... } const Time operator +(int s, const Time &T) // friend전역 { return T+s; }이미 존재하는 연산자 중에도 오버로딩의 대상이 아닌 것들이 있다. 다음 연산자들은 기능을 변경할 수 없다. 즉, 오버로딩의 대상이 아니다.
.(구조체 멤버 연산자) |
::(범위 연산자) |
?:(삼항 조건 연산자) |
.*( 멤버 포인터 연산자) |
sizeof |
typeid |
static_cast |
dynamic_cast |
const_cast |
reinterpret_cast |
new |
delete |
class Time { ... bool operator ==(const Time &T) const { return (hour == T.hour && min == T.min && sec == T.sec); } bool operator !=(const Time &T) const { return !(*this == T); } int operator >(const Time &T) const { return (hour*3600+min*60+sec > T.hour*3600+T.min*60+T.sec); } bool operator >=(const Time &T) const { return (*this == T || *this > T); } bool operator <(const Time &T) const { return !(*this >= T); } bool operator <=(const Time &T) const { return !(*this > T); } }
class Time { // time++ Time &operator ++() { sec++; min += sec/60; sec %= 60; hour += min/60; min %= 60; return *this; } // ++time const Time operator ++(int dummy) { Time R = *this; ++*this; return R; } }
class Person { .... Person &operator =(const Person &Other) { if (this != &Other) { delete [] Name; Name=new char[strlen(Other.Name)+1]; strcpy(Name,Other.Name); Age=Other.Age; } return *this; } };
Person A=B; // 복사 생성자 호출 Person A,B; A = B; // 대입 연산자 호출 |
Person Boy; // 여기서 디폴트 생성자. Person Young=Boy; // 여기서 복사 생성자.. 하지만 Boy는 디폴트 생성자로 만들어져 있는데 deep 카피 시도시 문제가 생김.. 반드시 복사 생성자에서는 인자로 넘어오는 타입에 대한 NULL확인 필요. |
... Time &operator +=(int s) { ...
ostream& operator<<(const char *); ostream& operator<<(char); ostream& operator<<(short); ostream& operator<<(int); ostream& operator<<(long); ostream& operator<<(float); ostream& operator<<(double); .... |
class Time { friend ostream &operator <<(ostream &c, const Time &T); friend ostream &operator <<(ostream &c, const Time *pT); ... }; ostream &operator <<(ostream &c, const Time &T) { c << T.hour << "시" << T.min << "분" << T.sec << "초"; return c; } ostream &operator <<(ostream &c, const Time *pT) { c << *pT; return c; }
DArray a[5]; a[4][0] = 10; // [4]는 a배열의 4번째 항목을 반환하고 클래스 내부에 정의된 [0] 항목을 반환한다. const DArray constA; printf("%d", constA[0]); // operator[]이 아닌 const ~ operator[] (~) const을 호출한다. 반드시 반환과 내용에 const가 있어야 컴파일 허용된다.
class DArray { .... ELETYPE &operator [](int idx) { // 기본 [] 연산자 return ar[idx]; } const ELETYPE &operator [](int idx) const { // const 형 인스턴스에 쓰이는 [] 연산자 return ar[idx]; } };
class Book { private: Author Writer; ... public: Author *operator->() { return &Writer; } }
class ScoreManager { private: // 성적을 저장하는 여러 가지 멤버 변수들 int ar[3][5][10][4]; public: ScoreManager() { memset(ar,0,sizeof(ar)); } int &operator()(int Grade,int Class,int StNum,const char *Subj) { return ar[Grade][Class][StNum][0]; } // [] 연산자와 같이 const형을 지원하기 위해서 const int &operator()(int Grade,int Class,int StNum,const char *Subj) const { return ar[Grade][Class][StNum][0]; } }; void main() { ScoreManager SM; printf("1학년 2반 3번 학생의 국어 성적 = %d\n",SM(1,2,3,"국어")); SM(2,3,4,"산수")=99; }
#include이런 메모리 할당 기법을 정확하게 구사하기 위해서는 연산자 오버로딩 자체에 대한 이해보다는 메모리 구조나 관리 기법에 대한 이해가 더 많이 필요하다.#include class AA { public: AA() { printf("생성자 호출\n"); } ~AA() { printf("소멸자 호출\n"); } }; void *operator new(size_t t) { printf("사용자용 new\n"); return malloc(t); } void operator delete(void *p) { printf("사용자용 delete\n"); free(p); } int main() { AA *a = new AA(); delete a; system("PAUSE"); return 0; } // 출력 결과 /* 사용자용 new 생성자 호출 소멸자 호출 사용자용 delete 계속하려면 아무 키나 누르십시오 . . . */
UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...