C++的操纵符重载概述
副标题#e#
1.什么是操纵符重载
可以利用分词将操纵符重载领略为:操纵符+重载。
C++中的操纵符许多,如+,-,*,\等等。
C++中的重载也是C++中面向工具多态的浮现。
简朴说操纵符重载:
C++中有:int a=2+3; 那么a=5
操纵符重载可以实现对自界说范例的操纵:
#include <iostream> using namespace std; class Point{ public: int x; int y; Point(int _x,int _y):x(_x),y(_y){ } Point operator+(Point &p){ int t1=this->x+p.x; int t2=this->y+p.y; Point t(t1,t2); return t; } }; int main() { Point p1(1,3); Point p2(2,6); Point p3 = p1+p2; cout<<"p3:("<<p3.x<<","<<p3.y<<")"; ///执行输出:p3:(3,9) return 0; }
2.操纵符重载的方法
操纵符重载的实现方法有两种,即通过“友元函数”可能“类成员函数”。如下面代码显示了这两种操纵符重载:
class Point{ public: int x; int y; Point(int _x,int _y); Point operator+(Point &p); ///类成员函数,类成员函数可以利用this指针获取自身工具 friend int operator*(Point &p1,Point &p2); ///友元函数 };
可以看出,一个重载“+”,一个重载“*”,都是双目运算符,可是类成员函数只有一个参数。这是因为类成员函数可以利用this指针获取自身的工具,而友元函数则不可。
所以类成员实现操纵符重载需要的形式参数比本来少一个,这样利用类成员函数实现一元操纵符就不需要参数了。
3.操纵符重载例子
#include <iostream> using namespace std; class Point{ public: int x; int y; Point(int _x,int _y):x(_x),y(_y){ } Point operator+(Point &p){ ///实现坐标向量加 int t1=this->x+p.x; int t2=this->y+p.y; Point t(t1,t2); return t; } friend int operator*(Point &p1,Point &p2); ///实现内积 }; int operator*(Point &p1,Point &p2) { return (p1.x*p2.x)+(p1.y*p2.y); } int main() { Point p1(1,3); Point p2(2,6); cout<<p1*p2<<endl; ///输出内积:20 Point p3 = p1+p2; cout<<"p3:("<<p3.x<<","<<p3.y<<")"<<endl; ///输出坐标和:(3,9) return 0; }
#p#副标题#e#
4.重载操纵符留意事项
(1)重载操纵符必需有一个类范例的参数。也就是说不能 int operator+(int,int);
(2)操纵符的优先级和结核性是牢靠的。
(3)不在具有短路求值特性。如&&、||等,两个数城市举办求值,并且顺序不定。
(4)不要重载具有内置寄义的操纵符。重载操纵符主要是补充普通操纵符对类范例数据的浸染。像赋值操纵符、取地点操纵符、逗号操纵符等对类范例操纵数都有默认的寄义。
(5)只能对已有的C++运算符举办重载,不答允用户本身界说新的运算符。
(6)绝大部门的运算符可重载,除了成员会见运算符.,浸染域运算符::,长度运算符sizeof以及条件运算符?:。
(7)运算符重载后不能改变运算符的操纵工具(操纵数)的个数。
5.特例操纵符"++"、"–"的重载
自增、自减操纵符有前后之分,通过一个无意义的整数参数来区分。无参数的是前置运算符,带参数的是后置运算符。
如:
int operator++(); //前置
int operator++(int x); //后置
自增操纵符实例
#include <iostream> using namespace std; class Array{ public: Array(int _num){ ///初始化一个数组,巨细为_num this->a=new int[_num]; this->num=_num; this->pos=0; for(int i=0;i<num;i=i+1) *((this->a)+i)=i; } ~Array(){ delete [] a; } int operator++(){ ///++前置 if(pos == num-1){ cout<<"Fuck"<<endl; return 0; } return *((this->a)+(++pos)); } int operator++(int x){ ///++后置 if(pos == num-1){ cout<<"Fuck"<<endl; return 0; } return *((this->a)+(pos++)); } int *a; int pos; int num; }; int main() { Array array(100); cout<<"pos="<<array.pos<<endl; cout<<"pre_position:"<<(++array)<<endl; cout<<"pos="<<array.pos<<endl; cout<<"********************************************************"<<endl; cout<<"pos="<<array.pos<<endl; cout<<"post_position:"<<(array++)<<endl; cout<<"pos="<<array.pos<<endl; cout<<"********************************************************"<<endl; return 0; }
执行功效: