您的位置:首页 > 编程语言 > C语言/C++

C++运算符重载

2014-04-25 10:20 148 查看
在C++中,操作符默认只是对内置类型进行操作,对于用户自己定义的数据类型,如果想要使用运算符,那么就要进行运算符重载了。

重载运算符要符合以下特性:

1、有4个操作符不可以重载,作用域运算符"::"、成员指针运算符“.*"、类属关系运算符"."、三目运算符”?::"。

2、重载操作符的操作数,必须至少有一个类类型。这是因为我们我们重载操作符的目的就是方便类类型处理。如果都是内置数据类型,就不用重载了。

3、重载不能改变操作符的优先级和结合性。

4、操作符重载后不再具有短路求值特性。例如,如果重载||、&&,两个操作数其实都要求值的。

5、重载操作符本质是通过函数来实现的。大多数重载函数既可以定义为类成员,也可以定义为非类成员,有时候还定义为友元。定义为友元是因为友元可以访问私有成员。

如果作为类成员,那么函数参数比运算符操作数数目少1,这是因为类成员函数默认有this指针,已经限定为第一个操作数。

赋值=、下标[]、调用()、和成员访问箭头->操作符重载,必须定义为成员函数

复合赋值操作,建议重载为成员函数

改变对边状态的,例如自增、自减、解引用等,通常定义为成员函数。(这些都是一元操作符)

对称操作符通常定义为非成员函数。如算法操作、相等操作、关系操作和位操作。

许多类要求支持IO操作,这样就需要重载实现输出<<和输入>>操作符

因为要和标准IO一致,所以操作符重载函数第一个参数为ostream或istream的引用。这样也就限制了重载函数不能为类成员。

输出重载格式

ostream& operator<<(ostream &os, const ClassType &object)

{

os<<……

return os;

}

输入重载的格式

istream& opetator>>(istream &in, ClassType &object)

{

in>>……

return in;

}

对于自增自减操作符,有前缀和后缀两种调用方式,但是仅仅通过调用无法区分,所以定义如下:

对于前缀调用形式

A& operator++();//前自增

对于后缀调用形式

A operator++(int);//后自增

一个实例:

#include<iostream>
using namespace std;
class A
{
	friend istream& operator>>(istream& in,A& a);//重载输入
	friend ostream& operator<<(ostream& out, const A& a);//重载输出
public:
	A(){};
	A(int k):count(k){}
	int count;

	A& operator++();//前自增
	A operator++(int);//后自增
};
A& A::operator++()
{
	count++;
	return *this;
}
A A::operator++(int k)
{
	A tmp(*this);
	count++;
	return tmp;
}

istream& operator>>(istream& in,A &a)
{
	in>>a.count;
	return in;
}
ostream& operator<<(ostream& out, const A& a)
{
	out<<a.count;
	return out;
}
A operator+(const A& a1,const A& a2)
{
	A tmp(a1);
	tmp.count+=a2.count;
	return tmp;
}
int main()
{
	A a1,a2,a3;
	cin>>a1>>a2;
	cout<<a1<<" "<<a2<<endl;
	a3=a1++;
	cout<<a3<<endl;
	a3=++a2;
	cout<<a3<<endl;

	a3=a1+a2;
	cout<<a3<<endl;
	system("pause");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: