c++ 运算符重载

在实际开发中,我们往往需要使用复合的数据类型,而只能针对基本类型的运算符已经不能满足需求。

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;
}

















评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值