在实际开发中,我们往往需要使用复合的数据类型,而只能针对基本类型的运算符已经不能满足需求。
c++对运算符操作数限制进行了扩展,支持复合数据类型的运算,这种扩展就是运算符重载
其格式为
数据类型 operator<运算符符号>(<参数表>)
{
<函数体>
}
以下运算符不能重载
1)对象访问运算符 " . "
2)成员指针原算符 " .* "
3)作用域运算符 " :: "
4) " sizeof " 运算符
5) 三目运算符 “ ? ”
合法的运算符重载有四个限制
1) 重载以后的运算符不能改变运算符的优先级和结合性
2)重载以后的运算符不能改变运算符操作数的个数及语法结构
3)重载以后的运算符操作数至少有一个是自定义类型的。
4)重载运算符函数通常不能有默认的参数
array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
#include<iostream>
using namespace std;
class Myarray{
private:
int *p;
int len;
public:
int name;
Myarray();
Myarray(int a);
~Myarray();
void show();
friend ostream &operator<<(ostream &o_s,const Myarray &a);
friend istream &operator>>(istream &i_s,Myarray &a);
Myarray &operator=(Myarray &a);
Myarray &operator-(void);
Myarray &operator++(void);
Myarray &operator++(int);
bool operator==(Myarray &a)
{
if(len!=a.len)
return false;
for(int i=0;i<len;i++)
{
if(p[i]!=a.p[i])
return false;
}
return true;
}
};
#endif
array.cpp
#include<iostream>
#include"array.h"
using namespace std;
Myarray::Myarray():len(1)
{
cout<<"no parameter array.len="<<len<<endl;
p=new int;
*p=1;
}
Myarray::Myarray(int a):len(a)
{
cout<<"array.len="<<len<<endl;
p=new int[len];
for(int i=0;i<len;i++)
{
p[i]=i;
}
}
Myarray::~Myarray()
{
cout<<"这里是"<<name<<"的析构函数"<<endl;
for(int i=0;i<len;i++)
{
cout<<p[i]<<"它的地址是"<<&p[i]<<endl;
}
delete [] p;
}
void Myarray::show()
{
for(int i=0;i<len;i++)
{
cout<<p[i]<<endl;
}
}
ostream &operator<<(ostream &o_s,const Myarray &a)
{
for(int i=0;i<a.len;i++)
{
o_s<<a.p[i]<<endl;
}
return o_s;
}
istream &operator>>(istream &i_s,Myarray &a)
{
cout<<"请输入"<<a.len<<"个数"<<endl;
for(int i=0;i<a.len;i++)
{
i_s>>a.p[i];
}
return i_s;
}
Myarray &Myarray::operator-(void)
{
const int s=len;
static Myarray d(s);
d.name=3;
for(int i=0;i<len;i++)
{
d.p[i]=-p[i];
}
return d;
}
Myarray &Myarray::operator=(Myarray &a)
{
for(int i=0;i<len;i++)
{
p[i]=a.p[i];
}
return *this;
}
Myarray &Myarray::operator++(void) //++m
{
for(int i=0;i<len;i++)
{
p[i]++;
}
return *this;
}
Myarray &Myarray::operator++(int)
{
static Myarray as;
as.len=len;
as.p=new int[len];
for(int i=0;i<len;i++)
{
as.p[i]=p[i];
}
++(*this);
return as;
}