c++运算符重载
2015-09-24 15:45
375 查看
哪些操作符不能被重载?
::
. ->
.* ?: 这5个符号不能被重载
注意: 1:重载运算符要保持原运算符的意义
2:只能对已有的运算符重载,不能增加新运算符
3:重载的运算符不会改变原先的优先级和结合性
4:重载的运算符不能有默认参数
为什么要运算符重载? c++中预定义的运算符的操作对象只能是基本数据类型,但是有时候我们需要对我们定义的类进行类似的运算操作,这时候,就需要用到运算符重载!
一般格式:<返回值说明符> operator <运算符符号>(<参数表>)
{
< 函数体>
}
成员函数运算符:<函数类型> operator <运算符>(<参数表>)
{
<函数体>
}
一般运算符重载:
成员函数运算符重载:
下面对++运算符进行重载(x++是先用后加,++x是先加后用):
一般运算符重载:
类成员运算符重载x++与++x :
注:
运算操作符重载把操作符的作用扩展到对象类型
为了访问类的保护对象,需要把重载函数定义为友元
操作符重载可以是成员函数
前增量和后增量通过一个形参区分
::
. ->
.* ?: 这5个符号不能被重载
注意: 1:重载运算符要保持原运算符的意义
2:只能对已有的运算符重载,不能增加新运算符
3:重载的运算符不会改变原先的优先级和结合性
4:重载的运算符不能有默认参数
为什么要运算符重载? c++中预定义的运算符的操作对象只能是基本数据类型,但是有时候我们需要对我们定义的类进行类似的运算操作,这时候,就需要用到运算符重载!
一般格式:<返回值说明符> operator <运算符符号>(<参数表>)
{
< 函数体>
}
成员函数运算符:<函数类型> operator <运算符>(<参数表>)
{
<函数体>
}
一般运算符重载:
#include<iostream> using namespace std; class RMB { private: int yuan; int jiao; public: RMB(){yuan=0;jiao=0;} RMB(int x,int y):yuan(x),jiao(y){} ~RMB(){} void display() { cout<<yuan<<"元"<<jiao<<"角"<<endl; } friend RMB operator+(const RMB&x,const RMB& y); <span style="color:#ff0000;">//将其设为友元函数</span> }; RMB operator+(const RMB& x,const RMB& y) <span style="color:#ff0000;">//类外实现+运算符重载 不能返回引用,因为temp是局部变量,用后即不存在</span> { RMB temp; temp.yuan=x.yuan+y.yuan; temp.jiao=x.jiao+y.jiao; return temp; } int main() { RMB r1(1,1); RMB r2(2,2); RMB r3; r3=r1+r2; r3.display(); return 0; }
成员函数运算符重载:
#include<iostream> using namespace std; class RMB { private: int yuan; int jiao; public: RMB(){yuan=0;jiao=0;} RMB(int x,int y):yuan(x),jiao(y){} ~RMB(){} void display() { cout<<yuan<<"元"<<jiao<<"角"<<endl; } RMB operator+(const RMB& x) <span style="color:#ff0000;">//类内部实现运算符重载</span> { RMB temp; temp.yuan=yuan+x.yuan; temp.jiao=jiao+x.jiao; return temp; } }; int main() { RMB r1(1,1); RMB r2(2,2); RMB r3; r3=r1+r2; r3.display(); return 0; }
下面对++运算符进行重载(x++是先用后加,++x是先加后用):
一般运算符重载:
#include<iostream> using namespace std; class RMB { private: int yuan; int jiao; public: RMB(){yuan=0;jiao=0;} RMB(int x,int y):yuan(x),jiao(y){} ~RMB(){} friend RMB& operator++( RMB& x); friend RMB operator++(RMB& x,int); void display() { cout<<yuan<<"元"<<jiao<<"角"<<endl; } }; RMB& operator++( RMB & x ) <span style="color:#ff0000;">// ++x;</span> { x.jiao++; if(x.jiao>=10) { x.jiao-=10; x.yuan+=1; } return x; } RMB operator++(RMB& x,int) <span style="color:#ff0000;">//x++ 这个地方不能返回引用,int是为了区别前增量与后增量,没有其他用处</span> { RMB temp; <span style="white-space:pre"> </span><span style="color:#ff0000;">//先用临时变量记录,然后返回临时变量</span> temp=x; x.jiao++; if(x.jiao>=10) { x.jiao-=10; x.yuan+=1; } return temp; } int main() { RMB r1(2,9); ++r1; r1.display(); r1++; r1.display(); return 0; } <span style="color:#ff6600;">skywalker@skywalker:~/work/test$ ./a.out 3元0角 3元1角</span>
类成员运算符重载x++与++x :
#include<iostream> using namespace std; class RMB { private: int yuan; int jiao; public: RMB(){yuan=0;jiao=0;} RMB(int x,int y):yuan(x),jiao(y){} ~RMB(){} void display() { cout<<yuan<<"元"<<jiao<<"角"<<endl; } RMB& operator++() <span style="color:#ff0000;">//++x; 返回引用</span> { jiao++; if(jiao>=10) { jiao-=10; yuan++; } return *this; <span style="color:#ff0000;">//返回this指针</span> } RMB operator++(int) <span style="color:#ff0000;">//x++; 不能返回引用</span> { RMB temp; temp=*this; <span style="color:#ff0000;"> //将this内容给临时变量</span> jiao++; if(jiao>=10) { jiao-=10; yuan++; } return temp; } }; int main() { RMB r1(2,9); ++r1; r1.display(); r1++; r1.display(); return 0; } <span style="color:#ff9900;">skywalker@skywalker:~/work/test$ ./a.out 3元0角 3元1角 </span>
注:
运算操作符重载把操作符的作用扩展到对象类型
为了访问类的保护对象,需要把重载函数定义为友元
操作符重载可以是成员函数
前增量和后增量通过一个形参区分
相关文章推荐
- C++的get()函数与getline()函数使用详解
- C++编程中用put输出单个字符和cin输入流的用法
- Java和C++通过Socket通信中文乱码的解决
- C++Bulder之字符数组转换成AnsiString类型
- More Effective C++ ——08_理解各种不同含义的new和delete
- Effective C++总结(二)
- Effective C++总结(一)
- poco c++感性认识
- 链表java与c++实现
- 【转】C语言文件操作解析(三)
- C语言数据转换问题
- 【转】C++读写二进制文件
- C++11 新特性:显式 override 和 final
- C++函数后加const的意义
- C++ - _T含义 C++语言中“_T”是什么意思
- C++内嵌第三方EXE程序窗口
- VC++_文件选择器
- C++利用WebBrowser控件创建自己的浏览器
- C语言中的运算符优先级
- C++ STL 常用容器 学习笔记