时间:2021-05-20
首先回忆下以前学的函数重载
函数重载
类中的函数重载
操作符重载(operator)
什么是操作符重载?
大家都知道,在C里,有'+,-,*,/'这些操作符,且它们的功能就是实现普通变量运算。
由于C++是面向对象的,遇到的变量大多都是对象,所以优化了C里的操作符,使它们拥有了重载能力.能通过一定方式,使对象能进行'+,-,*,/'等运算.
操作符的重载是以函数的方式进行.
操作符重载定义
操作符重载,通过operator关键字在函数前定义:
[返回类型] operator [需要重载的操作符](函数参数) { //...... }作符重载有几种方式 : 全局操作符重载函数、全局操作符重载函数
编译器首先会判断运算的若是对象,就会先从类里寻找成员操作符重载函数,若没找到,就会再去全局里寻找全局操作符重载函数.
注意事项:
比如赋值(=)、下标([])、下标([])、调用(())和成员访问箭头(->):
Test t3=t2; //相当于调用了: Test t3.operator =(t2); 里面会通过this指针来代替左侧数t3有些操作符既可以当做成员操作符重载函数,也可以当做全局操作符重载函数,由于函数参数可以多个,便称为二元操作符
比如加法(+),与(&&),或(||),逗号(,)等:
以加法(+)为例,当设为全局操作符重载函数时,执行
Test t3=t1+t2; //相当于调用了: Test t3 = operator +(t1,t2);以加法(+)为例,当设为成员操作符重载函数时,执行
Test t3=t1+t2; //相当于调用了: Test t3 =t1.operator +(t2); //里面会通过this指针来代替左侧数t1多个重载的操作符重载函数
由于操作符重载函数带参数,所以可以存在多个相同的操作符重载函数
例如:
初步试验
1.接下来,来个全局操作符重载函数例子:
#include "stdio.h" class Test{ int x; int y; public: Test(int x=0,int y=0) { this->x=x; this->y=y; } int getx() { return x; } int gety() { return y; } friend Test operator + (const Test& t1,const Test& t2); //声明友元函数,可以使用私有成员变量 }; Test operator + (const Test& t1,const Test& t2) //重载{ Test ret; ret.x=t1.x+t2.x; ret.y=t1.y+t2.y; return ret;} int main(){ Test t1(1,3); Test t2(2,4); Test t3= t1 + t2; // 其实就是调用: Test t3 = operator +(t1,t2); printf("t3.x:%d t3.y:%d\n",t3.getx(),t3.gety()); Test t4 =operator +(t1,t3); // t4 =t1 +t3 printf("t4.x:%d t4.y:%d\n",t4.getx(),t4.gety()); return 0;}打印结果:
t3.x:3 t3.y:7
t4.x:4 t4.y:10
换成成员操作符重载函数例子:
#include "stdio.h" class Test{ int x; int y; public: Test(int x=0,int y=0) { this->x =x; this->y =y; } int getx() { return x; } int gety() { return y; } Test operator + (const Test& t2) { Test ret; ret.x = this->x + t2.x; ret.y = this->y + t2.y; return ret; } }; int main(){ Test t1(1,3); Test t2(2,4); Test t3= t1 + t2; // 其实就是调用: Test t3 =t1.operator +(t2); printf("t3.x:%d t3.y:%d\n",t3.getx(),t3.gety()); Test t4 =t1.operator +(t3); // t4 =t1 +t3 printf("t4.x:%d t4.y:%d\n",t4.getx(),t4.gety()); return 0; }打印结果:
t3.x:3 t3.y:7
t4.x:4 t4.y:10
加深理解
由于C++里,没有复数的慨念,而在刚刚又学习了操作符重载,所以接下来便通过操作符重载来实现复数类
复数类应该具有
两个成员
实部a 、虚部b
运算操作符
+ - : 结果 = 两个实部进行加减,两个虚部进行加减
* : 结果 = (a1+b1)(a2+b2)= (a1*a2 - b1*b2 )+( a2*b1 + a1*b2);
/ : 结果 =(a1+b1)/(a2+b2)= (a1*a2+b1*b2)/(a2* a2+b2* b2) +(b1*a2-a1*b2)/(a2* a2+b2* b2)
比较操作符:== ,!=
赋值操作符: =
求模成员函数 : 等于a^2+b^2的算术平方根
所以复数类的操作符重载共有以下几个:
1.写头文件Complex.h:
#ifndef __COMPLEX_H#define __COMPLEX_H class Complex{ private: double a; double b; public: Complex(int a=0,int b=0); Complex operator + (const Complex& t); Complex operator - (const Complex& t); Complex operator * (const Complex& t); Complex operator / (const Complex& t); bool operator == (const Complex& t); bool operator != (const Complex& t); Complex& operator = (const Complex& t); double getModulus(); double getA(); double getB();}; #endif2.写源文件Complex.cpp
#include "Complex.h"#include "math.h" Complex::Complex(int a,int b){ this->a = a; this->b = b;} Complex Complex::operator + (const Complex& t){ Complex ret; ret.a = a + t.a; ret.b = b + t.b; return ret;} Complex Complex::operator - (const Complex& t){ Complex ret; ret.a = a - t.a; ret.b = b - t.b; return ret;} Complex Complex::operator * (const Complex& t){ Complex ret; ret.a = (a* t.a - b* t.b ); ret.b = (t.a *b + a* t.b ); return ret;} Complex Complex::operator / (const Complex& t){ Complex ret; ret.a = (a* t.a + b* t.b)/(t.a * t.a + t.b * t.b); ret.b = (b* t.a - a* t.b)/(t.a * t.a + t.b * t.b); return ret;} bool Complex::operator == (const Complex& t){ if((a== t.a)&&(b== t.b)) return true; else return false;} bool Complex::operator != (const Complex& t){ if((a!= t.a)||(b!= t.b)) return true; else return false;} Complex& Complex::operator = (const Complex& t){ if(this != &t) { a = t.a; b = t.b; } return *this;} double Complex::getModulus(){ return sqrt( a*a + b*b);} double Complex::getA(){ return a;} double Complex::getB(){ return b;}3.写测试文件test.cpp
#include "stdio.h"#include "Complex.h" int main(){ Complex t1(1,3); Complex t2(2,6); Complex t3=t1+t2; printf("t3.a=%f t3.b=%f\n",t3.getA(),t3.getB()); printf("t3 Modulus:%f\n",t3.getModulus()); Complex t4=t3; printf("t4==t3: %d\n",t4==t3); printf("t4!=t3: %d\n",t4!=t3); printf("t3==t1: %d\n",t3==t1); return 0;}4.编译运行
t3.a=3.000000 t3.b=9.000000
t3 Modulus:9.486833
t4==t3: 1 //为真
t4!=t3: 0 //为假
t3==t1: 0 //为假
以上所述是小编给大家介绍的C++-操作符重载、并实现复数类详解详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
区别C++中对于类来说,对于其中的成员,用点操作符.来获得,而对于一个指向类对象的指针来说,则用箭头操作符->调用该指针所指向对象的成员。当类定义->重载操作符
操作符的重载有一些规则:1.重载操作符必须具有一个类类型或枚举类型操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。如:intopera
一、什么是操作符重载操作符重载可以分为两部分:“操作符”和“重载”。说到重载想必都不陌生了吧,这是一种编译时多态,重载实际上可以分为函数重载和操作符重载。运算符
本文实例讲述了Python中操作符重载用法。分享给大家供大家参考,具体如下:类可以重载python的操作符操作符重载使我们的对象与内置的一样。__X__的名字的
new、delete(new[]、delete[])操作符的重载需要注意:1.重载的new、delete(或者new[]、delete[])操作符必须是类的静态