wbczyh 2019-11-02
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; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改!
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:
运算符重载时要遵循以下规则:
运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载。但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)
成员函数运算符
当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:
友元函数运算符
当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。
两种重载形式的比较
在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。但成员函数运算符与友元函数运算符也具有各自的一些特点:
在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里面定义了一个与操作符相关的函数。友元函数因为没有this指针,所以形参会多一个。
class A { public: A(int d):data(d){} A operator+(A&);//成员函数 A operator-(A&); A operator*(A&); A operator/(A&); A operator%(A&); friend A operator+(A&,A&);//友元函数 friend A operator-(A&,A&); friend A operator*(A&,A&); friend A operator/(A&,A&); friend A operator%(A&,A&); private: int 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); } A A::operator%(A &a) { return A(data%a.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); } A operator%(A &a1,A &a2) { return A(a1.data%a2.data); } //然后我们就可以对类的对象进行+、-、*、/了。 void main(void) { A a1(1),a2(2),a3(3); a1=a2+a3; //或者 a1=a2.operator+(a3); }
注意:在进行a2+a3的时候会出错,因为我们在上面对+定义了两种方法,去掉一种即可。
因为函数体比较简单,后面我就只给出成员函数形式的函数声明了,关系运算符有==,!=,<,>,<=,>=。
bool operator == (const A& ); bool operator != (const A& ); bool operator < (const A& ); bool operator <= (const A& ); bool operator > (const A& ); bool operator >= (const A& );
1 bool operator || (const A& ); 2 bool operator && (const A& ); 3 bool operator ! ();
这里的+、-是正负的意思,放在对象前面。
A& operator + (); A& operator - (); A* operator & (); A& operator * ();
++和–根据位置的不同有四种情况,都可以重载。
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);
上面的运算符重载都有两种方式,而下面的运算符只能用一种,特殊吧。 这些运算符的重载只能是成员函数。
A& operator = (const A& ); char operator [] (int i);//返回值不能作为左值 const char* operator () (); T operator -> (); //类型转换符 operator char* () const; operator int (); operator const char () const; operator short int () const; operator long long () const; //还有很多就不写了
而这些只能以友元函数的形式重载
1 friend inline ostream &operator << (ostream&, A&);//输出流 2 friend inline istream &operator >> (istream&, A&);//输入流
两种重载方式的比较:
注意事项:
转载:https://www.cnblogs.com/ECJTUACM-873284962/p/6771262.html#_labelTop