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