重载运算符
来源:互联网 发布:快速排序算法c语言函数 编辑:程序博客网 时间:2024/05/22 17:30
1.当一个重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数的参数比运算对象的数量少一个。
非成员函数调用等价于:
data1 + data2; //普通表达式operator+(data1, data2); //等价的函数调用成员函数调用等价于:
data1 + data2; //普通表达式data1.operator+(data2); //等价的函数调用
2.选择作为成员或者非成员
1)赋值(=)、下标([])、调用(())和成员访问箭头(->)运算符必须是成员。
2)复合赋值(+=)一般来说应该是成员,但不是必须。
3)递增、递减和解引用一般是成员。
4)具有对称性的运算符,例如算术、相等性、关系和位运算等,通常应该是普通的非成员函数。
3.重载输出运算符<<
ostream &operator<<(ostream &os, const Data &item){os << item ;//格式尽量一致,所以不大于换行符return os;}有以下几点说明:
1)第一个参数是非常量ostream对象的引用,常量是因为向流写入会改变其状态,引用是因为无法直接复制一个ostream对象(被禁止复制)。
2)第二个参数是常量引用。
3)返回ostream引用是为了和<<一致(cout<<data1<<data2<<endl;)
注意:输入输出运算符必须是非成员函数,否则,其左侧运算对象将是类的一个对象:
Data data;data << cout;
必须处理读入可能失败的情况,如果读入失败,对象被赋予默认的状态。
5.算术运算符
Data operator+=(const Data &lhs, const Data &rhs){Data sum = lhs;lhs += rhs; //假设已经定义了复合赋值运算符return sum; }注意:此处不能反悔引用,因为函数体已经建立了一个临时对象,返回的是临时对象的地址错误。
6.下标运算符
下标运算符必须是成员函数。
如果一个类包含下标运算符,则它通常会定义两个版本:一个返回普通引用,另一个是类的常量成员并且返回常量引用。
#include<iostream> #include <string> #include <vector> using namespace std;class StrVec{public:StrVec(int n){ element = new string[n]; }string & operator[](int n){ //左边不能是const对象return element[n];}const string & operator[](int n) const{//左边是const对象return element[n];}private:string *element;};int main(){StrVec svec(10);const StrVec cvec(10);svec[0] = "zero"; //正确,下标运算符返回string的引用cvec[0] = "zip"; //错误,下标运算符返回的是常量的引用return 0;}
7.递增递减运算符:
class StrBlobPtr{private:int cur;public:StrBlobPtr() :cur(0){}StrBlobPtr& operator++(){ //前置cur++;return *this;}StrBlobPtr operator++(int){ //后置StrBlobPtr temp = *this;++*this; //调用前置return temp; //因为返回临时,所以类型不能是引用}};注意:对于后置来说,在递增对象之前,先记录对象的状态。
8.成员访问运算符
在迭代器及智能指针类中常用到解引用运算符(*)和箭头运算符(->)
9.函数调用运算符
#include <vector> #include <iostream>using namespace std;class AbsInt{public:int operator()(int val) const{return val < 0 ? -val : val;}};int main(){AbsInt absInt;cout << absInt(-1) << endl;return 0;}
0 0
- 运算符重载 [++,--,+,<<; &&,||(不可重载)]
- 重载之运算符重载
- 重载赋值运算符
- C++运算符重载
- 运算符重载
- 运算符重载总结
- 运算符重载例子
- 运算符重载
- 运算符重载
- 基础:运算符重载
- 运算符重载
- 运算符重载
- 重载赋值运算符
- C#运算符重载
- C++-运算符重载
- 重载赋值运算符
- 运算符重载
- 有关运算符重载
- android回调是怎么实现的? --以自定义Dialog为例
- pb 制作登陆界面连接数据库
- bzoj 1001狼抓兔子
- 202. Happy Number
- log4j
- 重载运算符
- nginx启动、关闭、重启
- linux设备驱动归纳总结(六):3.中断的上半部和下半部——工作队列
- JavaScript
- OpenCV实践之路——TrackBar调整图像的亮度和对比度(OpenCV1和OpenCV2两种版本)
- CodeForces 620 A. Professor GukiZ's Robot(水~)
- 2.10 Android 代码的混淆
- 【翻译】Leapmotion-python开发官方文档(5)
- 问题:java小程序在打开时被安全设置阻止,无法打开java小程序