struct
node {
//定义一个结构体node(节点)
int
x;
int
y;
int
len;
//node中有3个成员变量x,y,len
bool
operator <(
const
node &a)
const
{
//重载<操做符。能够对两个node使用<操做符进行比较
return
len<a.len;
}
};
想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系!node
运算符重载时要遵循如下规则:函数
成员函数运算符性能
当运算符重载为类的成员函数时,函数的参数个数比原来的操做数要少一个(后置单目运算符除外),这是由于成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操做数。所以:this
友元函数运算符spa
当运算符重载为类的友元函数时,因为没有隐含的this指针,所以操做数的个数没有变化,全部的操做数都必须经过函数的形参进行传递,函数的参数与操做数自左至右一一对应。指针
两种重载形式的比较code
在多数状况下,将运算符重载为类的成员函数和类的友元函数都是能够的。但成员函数运算符与友元函数运算符也具备各自的一些特色:对象
在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,因此运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里面定义了一个与操做符相关的函数。友元函数由于没有this指针,因此形参会多一个。blog
1 class A 2 { 3 public: 4 A(int d):data(d){} 5 A operator+(A&);//成员函数 6 A operator-(A&); 7 A operator*(A&); 8 A operator/(A&); 9 A operator%(A&); 10 friend A operator+(A&,A&);//友元函数 11 friend A operator-(A&,A&); 12 friend A operator*(A&,A&); 13 friend A operator/(A&,A&); 14 friend A operator%(A&,A&); 15 private: 16 int data; 17 }; 18 //成员函数的形式 19 A A::operator+(A &a) 20 { 21 return A(data+a.data); 22 } 23 A A::operator-(A &a) 24 { 25 return A(data-a.data); 26 } 27 A A::operator*(A &a) 28 { 29 return A(data*a.data); 30 } 31 A A::operator/(A &a) 32 { 33 return A(data/a.data); 34 } 35 A A::operator%(A &a) 36 { 37 return A(data%a.data); 38 } 39 //友元函数的形式 40 A operator+(A &a1,A &a2) 41 { 42 return A(a1.data+a2.data); 43 } 44 A operator-(A &a1,A &a2) 45 { 46 return A(a1.data-a2.data); 47 } 48 A operator*(A &a1,A &a2) 49 { 50 return A(a1.data*a2.data); 51 } 52 A operator/(A &a1,A &a2) 53 { 54 return A(a1.data/a2.data); 55 } 56 A operator%(A &a1,A &a2) 57 { 58 return A(a1.data%a2.data); 59 } 60 //而后咱们就能够对类的对象进行+、-、*、/了。 61 void main(void) 62 { 63 A a1(1),a2(2),a3(3); 64 a1=a2+a3; 65 //或者 66 a1=a2.operator+(a3); 67 }
注意:在进行a2+a3的时候会出错,由于咱们在上面对+定义了两种方法,去掉一种便可。接口
由于函数体比较简单,后面我就只给出成员函数形式的函数声明了,关系运算符有==,!=,<,>,<=,>=。
1 bool operator == (const A& ); 2 bool operator != (const A& ); 3 bool operator < (const A& ); 4 bool operator <= (const A& ); 5 bool operator > (const A& ); 6 bool operator >= (const A& );
1 bool operator || (const A& ); 2 bool operator && (const A& ); 3 bool operator ! ();
这里的+、-是正负的意思,放在对象前面。
1 A& operator + (); 2 A& operator - (); 3 A* operator & (); 4 A& operator * ();
++和–根据位置的不一样有四种状况,均可以重载。
1 A& operator ++ ();//前置++ 2 A operator ++ (int);//后置++ 3 A& operator --();//前置-- 4 A operator -- (int);//后置--
按位操做。
1 A operator | (const A& ); 2 A operator & (const A& ); 3 A operator ^ (const A& ); 4 A operator << (int i); 5 A operator >> (int i); 6 A operator ~ ();
没有=哦。
1 A& operator += (const A& ); 2 A& operator -= (const A& ); 3 A& operator *= (const A& ); 4 A& operator /= (const A& ); 5 A& operator %= (const A& ); 6 A& operator &= (const A& ); 7 A& operator |= (const A& ); 8 A& operator ^= (const A& ); 9 A& operator <<= (int i); 10 A& operator >>= (int i);
1 void *operator new(size_t size); 2 void *operator new(size_t size, int i); 3 void *operator new[](size_t size); 4 void operator delete(void*p); 5 void operator delete(void*p, int i, int j); 6 void operator delete [](void* p);
上面的运算符重载都有两种方式,而下面的运算符只能用一种,特殊吧。 这些运算符的重载只能是成员函数。
1 A& operator = (const A& ); 2 char operator [] (int i);//返回值不能做为左值 3 const char* operator () (); 4 T operator -> (); 5 //类型转换符 6 operator char* () const; 7 operator int (); 8 operator const char () const; 9 operator short int () const; 10 operator long long () const; 11 //还有不少就不写了
而这些只能以友元函数的形式重载
1 friend inline ostream &operator << (ostream&, A&);//输出流 2 friend inline istream &operator >> (istream&, A&);//输入流
两种重载方式的比较:
注意事项: