运算符重载是C++的重要组成部分,它可以让程序更加的简单易懂,简单的运算符使用可以使复杂函数的理解更直观。
1、对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。
对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运算符函数参数表中含有一个函数。这个问题要搞清楚,有一个this指针的问题。。。
2、双目运算符一般可以用友元函数重载和成员函数重载,但有一种情况只可以用友元函数重载。
即:双目运算符左边的变量是一个常量,而不是对象!!!这点很重要的额。
对于普通对象来说我们很自然的会频繁使用算数运算符让他们参与计算,但是对于自定义类的对象来说,我们是无论如何也不能阻止写出像下面的代码一样的程序来的。
例子如下:
class Test { //过程省略 } int main() { Test a,c; c=a+a; } |
当然这样的代码是不能够通过编译的,c++对自定类的算术运算部分保留给了程序员,这也是符合c++灵活特性的。
在c++中要想实现这样的运算就必须自定义运算符重载函数,让它来完整具体工作。
在这里要提醒读者的是,自定义类的运算符重载函数也是函数,你重载的一切运算符不会因为是你自己定义的就改变其运算的优先级,自定义运算符的运算优先级同样遵循与内部运算符一样的顺序。
除此之外,c++也规定了一些运算符不能够自定义重载,例如.、::、.*、.->、?:。
下面我们来学习如何重载运算符,运算符重载函数的形式是:
返回类型 operator 运算符符号 (参数说明) { //函数体的内部实现 } |
运算符重载函数的使用主要分为两种形式,一种是作为类的友元函数进行使用,另一种则是作为类的成员函数进行使用。
下面我们先看一下作为类的友元函数使用的例子:
#include <iostream> using namespace std; class Test { public: Test(int a = 0) { Test::a = a; } friend Test operator +(Test&,Test&); friend Test& operator ++(Test&); public: int a; }; Test operator +(Test& temp1,Test& temp2)//+运算符重载函数 { //cout<<temp1.a<<"|"<<temp2.a<<endl;//在这里可以观察传递过来的引用对象的成员分量 Test result(temp1.a+temp2.a); return result; } Test& operator ++(Test& temp)//++运算符重载函数 { temp.a++; return temp; } int main() { Test a(100); Test c=a+a; cout<<c.a<<endl; c++; cout<<c.a<<endl; system("pause"); } |