运算符重载(operator overloading)只是一种语法上的方便,也就说他只是另一种函数的调用方式。
在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通函数的定义,只是函数的名字由关键字operator及其后紧跟的运算符组成。差别仅此而已。他像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。
对于运算符重载首先它是一个有趣的工具。但是,它仅仅只是一种语法上的方便,是另外一种函数调用方式。因此,只有在涉及类的代码更易写,尤其是更加容易读时才有理由进行运算符重载。
运算重载语法:
定义运算符重载就像定义函数,只是该函数的名字是operator@,这里@代表了被重载的运算符。函数参数表中参数的个数取决于两个因素:
(1) 运算符是一元的(一个参数),二元的(两个参数);
(2) 运算符被定义为全局函数(一元是一个参数,二元是两个参数)还是成员函数(一元没有参数、二元一个参数—此时该类的对象用做左侧的参数);
#include
using namespace std;
class Integer
{
int i;
public:
explicit Integer(int ii) : i(ii){}
const Integer
operator+(const Integer& rv) const
{
cout << "operator+" << endl;
return Integer(i + rv.i);
}
Inter&
operator+=(const Integer& rv)
{
cout << "operator+=" << endl;
i += rv.i;
return *this;
}
};
int main()
{
cout << "built-in types:" << endl;
int i = 1, j = 2, k = 3;
k += i + j;
cout << "user-defined types:" << endl;
Interger ii(1), jj(2), kk(3);
kk += ii + jj;
}
对于二元运算符,唯一的参数是出现在运算符右侧的那个操作数。当一元运算符被定义为成员函数时,是没有参数的。所掉用的成员函数属于运算符左侧的那个对象。operator+产生一个新的Interger(临时的),它用作operator+=的rv(右)参数。一但这个临时变量不在需要就销毁。
:: .* . ?:
注意事项
下标运算符operator[],必须是成员函数并且只接受一个参数。因为它所作用的对象应该像数组一样操作,可以经常从这个运算符返回一个引用,所以他可以很方便的被应用于等号左侧。这个运算符经常被重载。
class Array
{
public:
expilicit Array(){};
~ Array(){};
int& operator[](const int x)
{
return i[x];
}
int i[7];
};
void main()
{
Array T;
T[4] = -1;
}
class Before
{
public:
int m_Val;
};
Before& operator,(int,Before& b)
{
cout << "前" << endl;
return b;
}
class After
{
public:
explicit After(){}
~After(){}
const After& operator,(const After&)
{
cout << "后"<ui =4;
retun *this;
}
int ui;
};
int main()
{
Before c;
1,c;
After b,a;
b.ui = 8;
a.ui = 3;
b,a;
return 0;
}
当希望一个对象表现的像一个之针时通常用operator->.
#include "stdafx.h"
template
class CExam
{
public:
explicit CExam():m_p(new T){}
~CExam(){
delete m_p;
}
T* operator ->() { return m_p; }
private:
T* m_p;
};
class tmpClas
{
public:
tmpClas(){}
~tmpClas(){}
void CalTime()
{
int yu;
yu =2+2;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CExam tmpV;
tmpV->CalTime();
return 0;
}
所有一元运算符 成员
= () -> ->* 必须是成员
+= -= /= *= ^= &= |= %= >>= <<= 成员
所有其他二元运算符 非成员