预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

运算符重载(operatoroverload)是c++的一个重要的新特性,它使得程序员把c++运算符定义扩展到操作数是对象的情况.运算符重载的目的是使c++程序更加直观,更易懂. 运算符重载和普通的重载一样: 作用域相同,函数名字相同,但参数不同(参数个数,参数的类型),注意如果函数名字相同,参数相同但函数的返回值类型不同这不是重载,这是错误! 返回值类型operator被重载的运算符(参数...){函数的实现} 具体的例子网上有很多,我的重点是一些我们在写重载中易忽略的一些小问题. 有时候我们的程序在多数情况下是对的但有时也总有一些出乎我们意料的情况: 请看下面这个程序: #include<iostream> #include<stdlib.h> usingnamespacestd; int/*explicit*/add(inta,intb)//1 { cout<<"intint"<<endl; returna+b; } float/*explicit*/add(floata,floatb)//2 { cout<<"floatfloat"<<endl; returna+b; } intmain() { cout<<add(1,1)<<endl;//这里完全匹配没有问题 //cout<<add(1.1,2.0)<<endl;//这里编译器编译的时候会有歧义 cout<<add(1.1,2)<<endl;//问题出现这里编译器会有一个隐式类型转换 //编译器会把1.1向下隐式转换为1(double->int) //这里编译器不会把2向上转换即(int->double)这的强者类型转换 //呵呵恐怖吗你以为你在调用第二个函数结果调用的是第一个 system("pause"); } 运算结果: 我本以为第二个cout会调用第二个函数结果,但结果程序调用的是第一个 这里涉及到类型转换编译器默认会把1.1->1(double->int)向下转换. 而不是把2->2.0(int->double)这样是强制类型转换. 那么如何避免编译器的隐藏类型转换了 那就是explicit(清晰的)关键字 这个关键字的作用是告诉编译器禁止默认的类型转换,从而导致一些非法的参数 被默认转换成为合法的参数.我在opencv的头文件中见到了很多这个关键字可见这个关键字还是很重要的. 加了以后编译器会报错 下面是一个运算符重载的例子: #include<iostream> #include<stdlib.h> usingnamespacestd; classComplex { public: Complex(){real=0,image=0;}; Complex(double,double); Complexoperator++(int); Complex&operator++(); Complex&operator--(); Complexoperator+(constComplex&); Complexoperator-(constComplex&); Complexoperator*(constComplex&); //Complex&operator+=(Complex&); //Complex&operator-=(Complex&); //iostream&operator<<(iostream&); //iostream&operator>>(iostream&); doublegetReal(); doublegetimage(); //private: doublereal; doubleimage; }; Complex::Complex(doubler,doublei) { real=r; image=i; }; Complex&Complex::operator++() { real++; image++; return*this; } ComplexComplex::operator++(inta) { Complextemp=*this; real++; image++; returntemp; } Complex&Complex::operator--() { real--; image--; return*this; }; ComplexComplex::operator+(constComplex&a) { returnComplex(real+a.real,image+a.image); }; ComplexComplex::operator-(constComplex&a) { return