网站首页 > 基础教程 正文
要实现自定义的类也能应用操作符,就需要重载操作符,让操作符具有成员函数的功能。
1 不考虑使用操作符,用成员函数实现需要的功能
实例:实现复数的加减法
上面程序虽然实现了复数的加减法,但其表达形式较为繁琐。如果有复数a、b、c、d,要计算a+b-(c+d)将会变得比较复杂。如果不是调用函数,而是使用操作符,就会直观得多。
2 重载操作符,用操作符替代冗长的函数名
C++中的操作符原本只支持内置的数据类型,例如整型和浮点型。对于自行定义的复数类,需要通过重载的方式来告知如何实现复数的加减法。声明一个操作符重载的格式为:
返回值类型 operator 操作符(参数表);
事实上,在声明和定义操作符重载时,可以将其看作成员函数。只不过这个函数名是操作符。在声明和定义操作符重载时需要注意以下几点:
I 操作符只能是C++中存在的操作符,另外,::、.、?:、sizeof等操作符不能重载;
II 参数表中罗列的是操作符的各个操作数。重载后操作数的个数应该与原来相同。不过如果操作符作为成员函数,则调用者本身是一个操作数,故而参数表中会减少一个操作数。
III 各个操作数至少要有一个是自定义类型的数据,如结构体或类。
IV 尽量不要混乱操作符的含义。如果把加号用在减法上,会使程序的可读性大大下降。
实例:重载操作符,实现复数的加减法
附代码1:
//complex.h #include <iostream> using namespace std; class Complex //声明一个复数类 { public: Complex(Complex &a); //拷贝构造函数 Complex(double r=0,double i=0); void display(); //输出复数的值 void set(Complex &a); Complex plus(Complex a); //复数的加法 Complex minus(Complex a); //复数的减法 Complex plus(double r); //复数与实数相加 Complex minus(double r); //复数与实数相减 private: double real; //复数实部 double img; //复数虚部 }; Complex::Complex(Complex &a) { real=a.real; img=a.img; } Complex::Complex(double r,double i) { real=r; img=i; } void Complex::display() { cout<<real <<(img>=0?"+":"") <<img<<"i"; //适合显示1-3i等虚部为负值的复数 } void Complex::set(Complex &a) { real=a.real; img=a.img; } Complex Complex::plus(Complex a) { Complex temp(a.real+real,a.img+img); return temp; } Complex Complex::minus(Complex a) { Complex temp(real-a.real,img-a.img); return temp; } Complex Complex::plus(double r) { Complex temp(real+r,img); return temp; } Complex Complex::minus(double r) { Complex temp(real-r,img); return temp; } //main.cpp #include "complex.h" #include <iostream> using namespace std; int main() { Complex a(3,2),b(5,4),temp; temp.set(a.plus(b)); //temp=a+b a.display(); cout<<"+"; b.display(); cout<<"="; temp.display(); cout<<endl; a.display(); cout<<"-"; b.display(); cout<<"="; temp.set(a.minus(b)); //temp=a-b temp.display(); cout<<endl; cin.get(); return 0; } /*output: 3+2i+5+4i=8+6i 3+2i-5+4i=-2-2i */
附代码2:
//complex.h #include <iostream> using namespace std; class Complex //声明一个复数类 { public: Complex(Complex &a); Complex(double r=0,double i=0); void display(); void operator =(Complex a); //赋值操作 Complex operator +(Complex a); //加法操作 Complex operator -(Complex a); //减法操作 Complex operator +(double r); //加法操作 Complex operator -(double r); //减法操作 private: double real; double img; }; Complex::Complex(Complex &a) { real=a.real; img=a.img; } Complex::Complex(double r,double i) { real=r; img=i; } void Complex::display() { cout<<real <<(img>=0?"+":"") <<img<<"i"; } void Complex::operator =(Complex a) { real=a.real; img=a.img; } Complex Complex::operator +(Complex a) { Complex temp(a.real+real,a.img+img); return temp; } Complex Complex::operator -(Complex a) { Complex temp(real-a.real,img-a.img); return temp; } Complex Complex::operator +(double r) { Complex temp(real+r,img); return temp; } Complex Complex::operator -(double r) { Complex temp(real-r,img); return temp; } //main.cpp #include "complex.h" #include <iostream> using namespace std; int main() { Complex a(3,2),b(5,4),c(1,1),d(4,2),temp; a.display(); cout<<"+"; b.display(); cout<<"="; temp=a+b; //这样的复数加法看上去很直观 temp.display(); cout<<endl; a.display(); cout<<"-"; b.display(); cout<<"="; temp=a-b; temp.display(); cout<<endl; cout<<"a(3,2),b(5,4),c(1,1),d(4,2)"<<endl; cout<<"a+b-(c+d):"<<endl; temp=a+b-(c+d); //可以和括号一起使用了 temp.display(); cout<<endl; cin.get(); return 0; } /*output: 3+2i+5+4i=8+6i 3+2i-5+4i=-2-2i a(3,2),b(5,4),c(1,1),d(4,2) a+b-(c+d): 3+3i */
-End-
- 上一篇: C++之构造与析构 c++构造类
- 下一篇: C++构造函数和析构函数详解 c语言构造函数和析构函数
猜你喜欢
- 2024-10-12 全面剖析 C++ Boost 智能指针!| CSDN 博文精选
- 2024-10-12 C++设计模式——原型模式 设计模式之原型模式
- 2024-10-12 如何攻克 C++ 中复杂的类型转换? c++中四种类型转换的方式
- 2024-10-12 C++|由成员函数到运算符重载(类内、类外、友元方式重载)
- 2024-10-12 C++11新特性(49)- 用移动类对象代替拷贝类对象
- 2024-10-12 C++类的默认成员函数 c++类中定义的成员默认访问属性为( )
- 2024-10-12 C++的23种设计模式(上篇-创建型模式)
- 2024-10-12 C++构造函数和析构函数详解 c语言构造函数和析构函数
- 2024-10-12 c++——默认成员函数 c++成员变量默认值
- 2024-10-12 C++之构造与析构 c++构造类
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)