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...