重载运算符

来源:互联网 发布:快速排序算法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;



4.重载输入运算符>>

必须处理读入可能失败的情况,如果读入失败,对象被赋予默认的状态。


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
原创粉丝点击