有关函数调用运算符重载的问题,希望相关高手过来解释一下,不胜感激!
什么是函数调用运算符的重载,(请出示相关例子以助理解)它和下标运算符的重载有什么样的区别?什么是运算子类型,它和函数调用运算符的重载有什么关系?
用自定义的函数调用运算符调用函数与一般的调用函数有什么不同吗?
什么时候要重载函数调用运算符?
在书上看了一个为类Assc_array定义一个迭代算子的例子,还是不太明白。
运算符重载增强了C++语言的可扩充性。在C++中,说明一个类就是说明了一个新类型。因此,类对象和变量一样,可以作为参数传递,也可以作为返回类型。在基本数据类型上,系统提供了许多预定义的运算符,它们可以用一种简洁的方式工作,例如“+”运算符:
int x,y;
y=x+y;这是表达两个整数相加的方法,非常简单 。若有一个类:
class x{ public: int y; //.... };
void main() { x a,b; //定义了两个对象 a.y=a.y+b.y; //将两个对象的数据内容相加 //... }
从上面的例子看出,这样表达不如前面的简洁,也不直观;而且还存在一个问题, 若类x中的y为私有成员,上述表达式a.y=a.y+b.y就是错误的。因此,人们为了表达上的方便,希望已预定义的运算符(如+,-,*,/等),也可 以在特定类的对象上以新的含义进行解释。如上面的表达式则希望变为a=a+b,这就需要 用重载运算符来解决。
在C++中,大多数系统预定义的运算符都能被重载。例如:
+ - * / % ^ & | ~ ! = < > += -= *= <== == != <= >= && || ++ -- [ ] ( ) new delete
也有一些运算符是不能被重载的,如:
. :: *(此处是指针的意思,上面的为乘) ? : #
重载运算符时,不能改变它们的优先级,不能改变这些运算符所需操作数的数目。
在C++中,通常将运算符重载运算符的成员函数称为运算符函数。
(1)在类定义体中声明运算符函数
形式: type operator@(参数表)
type为返回值类型,operator是关键字,@代表所要重载的运算符号,参数表中罗列的是该运算符需要的操作数。例如:
class x{ //... int y; x operator + (x a); };
(2)定义运算符函数
形式: type x::operator @(参数表) { //定义的操作 }
例如: x x::operator + (x a) { x b; b.y=y+a.y; return b; }
void main() { x a1,b1; y a2,b2; a1=a1+b1; //正确,因为类x的“+”号已重载 a2=a2+b2; //错误,因为类y的“+”号没有重载 }
对类x的对象来说,“+”已经被赋予了重新的运算意义,不再是系统预定义含义。
[此贴子已经被作者于2004-10-01 23:36:40编辑过]
类的重载其实就是普通类型重载用到类上而已,不过要加operator关键字。
类的重载分为友元和非友元两种,其实也差不多,只是形式上不同而已。
http://jpk.shcemt.edu.cn/cplus/kejian/CONTENT/chapter7/chapter7_2_1.htm