C++程序设计教程第七章.ppt
文本预览下载声明
程序解释 #include iostream.h class Point{ int x,y; public: void set(int a,int b){x=a,y=b;} void print() const {cout(x,y)endl;} friend Point operator+(const Point a,const Point b); friend Point add(const Point a,const Point b ); }; Point operator+(const Point a,const Pointb) { Point s; s.set(a.x+b.x,a.y+b.y); return s; }//重载“+”操作符的友元函数 Point add(const Point a,const Pointb) { Point s; s.set(a.x+b.x,a.y+b.y); return s; } }//实现a+b的友元函数 void main() { Point a,b; a.set(3,2);b.set(1,5); (a+b).print();//s.print(); operator+(a,b).print(); add(a,b).print(); //s.print(); } (1)“+”被重载,并被声明成Point的友元。 (2)重载后的“+”有两种使用方式:(a+b)和operator+(a,b)。 (3)(a+b).print()是调用(a+b)的print()。 (4)a+b也可以通过add函数实现。 操作符重载的一般形式 1. 操作符重载(续) 类体内: friend 类名 operator 运算符(参数表); 类体外: 类名 operator 运算符(参数表){函数体}; 例如: friend Point operator+(const Point a,const Point b); Point operator+(const Point a,const Point b) { Point s; s.set(a.x+b.x,a.y+b.y); return s; } 2. 操作符重载的性质和限制 不能利用重载创建新的操作符。 拒绝新创 例如:@不是C++的操作符,故不能重载。 个别重载限制 C++规定双目操作符:“::”、“.”、“*”不能重载。 三目操作符:“?:”,以及sizeof和typeof不能重载。 2. 操作符重载的性质和限制(续) 优先级和结合性不变 操作符重载后,虽然语义增强了,但仍遵守原来的优先级和结合性。 例如: Point a,b,c; Point d =a+b*c;//先b*c再与a相加 操作数个数不变 专门处理对象 忌意义相左 3. 成员操作符(Member Operators) 我们知道,操作符的重载是通过函数实现的,可以用非成员函数形式重载(友元)。 实际上,操作符也可以用类的成员函数形式重载,此时的操作符就成了类的成员,称为成员操作符,它也是一种成员函数。 #include iostream.h class Point{ int x,y; public: void set(int a,int b){x=a,y=b;} void print() const {cout(x,y)endl;} Point operator+(const Point d){}; //+是Point的成员 }; 3. 成员操作符(续) 示例 例7-17 以成员操作符的形式重载“+”,使之能实现二维坐标系上的“点”对象相加。以非成员函数的形式重载“”,使之能按(x,y)格式输出一个点对象的坐标。 分析 (1)“点”的相加,参见例7-16。 (2)输出(x,y),需要多次执行运算: cout“(“x“,”y“)”。5次执行 程序 #include iostream.h class Point { int x,y; public: void set(int a,int b){x=a,y=b;} void print() const {cout (x ,y“);} Point operator+(const Point d){ Point s; s.set(x+d.x,y+d.y); return s;
显示全部