目錄
c++的一大特性就是重載(overload),通過重載可以把功能相似的幾個(gè)函數(shù)合為一個(gè),使得程序更加簡潔、高效。在c++中不止函數(shù)可以重載,運(yùn)算符也可以重載。由于一般數(shù)據(jù)類型間的運(yùn)算符沒有重載的必要,所以運(yùn)算符重載主要是面向?qū)ο笾g的。
class A
{
public:
A(int d):data(d){}
A operator+(A&);//成員函數(shù)
A operator-(A&);
A operator*(A&);
A operator/(A&);
A operator%(A&);
friend A operator+(A&,A&);//友元函數(shù)
friend A operator-(A&,A&);
friend A operator*(A&,A&);
friend A operator/(A&,A&);
friend A operator%(A&,A&);
private:
int data;
};
//成員函數(shù)的形式
A A::operator+(A &a)
{
return A(data+a.data);
}
A A::operator-(A &a)
{
return A(data-a.data);
}
A A::operator*(A &a)
{
return A(data*a.data);
}
A A::operator/(A &a)
{
return A(data/a.data);
}
A A::operator%(A &a)
{
return A(data%a.data);
}
//友元函數(shù)的形式
A operator+(A &a1,A &a2)
{
return A(a1.data+a2.data);
}
A operator-(A &a1,A &a2)
{
return A(a1.data-a2.data);
}
A operator*(A &a1,A &a2)
{
return A(a1.data*a2.data);
}
A operator/(A &a1,A &a2)
{
return A(a1.data/a2.data);
}
A operator%(A &a1,A &a2)
{
return A(a1.data%a2.data);
}
//然后我們就可以對(duì)類的對(duì)象進(jìn)行+、-、*、/了。
void main(void)
{
A a1(1),a2(2),a3(3);
a1=a2+a3;
//或者
a1=a2.operator+(a3);
}
注意:在進(jìn)行a2+a3的時(shí)候會(huì)出錯(cuò),因?yàn)槲覀冊谏厦鎸?duì)+定義了兩種方法,去掉一種即可。
bool operator == (const A& );
bool operator != (const A& );
bool operator < (const A& );
bool operator <= (const A& );
bool operator > (const A& );
bool operator >= (const A& );
bool operator || (const A& );
bool operator && (const A& );
bool operator ! ();
這里的+、-是正負(fù)的意思,放在對(duì)象前面。
A& operator + ();
A& operator - ();
A* operator & ();
A& operator * ();
++和--根據(jù)位置的不同有四種情況,都可以重載。
A& operator ++ ();//前置++
A operator ++ (int);//后置++
A& operator --();//前置--
A operator -- (int);//后置--
按位操作。
A operator | (const A& );
A operator & (const A& );
A operator ^ (const A& );
A operator << (int i);
A operator >> (int i);
A operator ~ ();
沒有=哦。
A& operator += (const A& );
A& operator -= (const A& );
A& operator *= (const A& );
A& operator /= (const A& );
A& operator %= (const A& );
A& operator &= (const A& );
A& operator |= (const A& );
A& operator ^= (const A& );
A& operator <<= (int i);
A& operator >>= (int i);
void *operator new(size_t size);
void *operator new(size_t size, int i);
void *operator new[](size_t size);
void operator delete(void*p);
void operator delete(void*p, int i, int j);
void operator delete [](void* p);
上面的運(yùn)算符重載都有兩種方式,而下面的運(yùn)算符只能用一種,特殊吧。這些運(yùn)算符的重載只能是成員函數(shù)。
A& operator = (const A& );
char operator [] (int i);//返回值不能作為左值
const char* operator () ();
T operator -> ();
//類型轉(zhuǎn)換符
operator char* () const;
operator int ();
operator const char () const;
operator short int () const;
operator long long () const;
//還有很多就不寫了
而這些只能以友元函數(shù)的形式重載
friend inline ostream &operator << (ostream&, A&);//輸出流
friend inline istream &operator >> (istream&, A&);//輸入流
兩種重載方式的比較:
聯(lián)系客服