c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态。操作符重载函数的格式一般为:
operator op (参数列表);// operator是关键字,op 代表操作符,编译器会自动过滤掉空格
一、重载操作符 ‘+’
下面以重载一个向量的加法为例:
操作符函数一般只有一个参数。当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。
(1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
(2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
(3) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。
这里有一点要注意:返回值不能是引用。因为是引用,其引用的是v0的对象,而v0在函数结束时会被销毁,所以引用将指向一个不存在的对象。而使用MyVector则是在v0被销毁时构造它的拷贝,调用函数将得到该拷贝。
在主函数中有如上两种调用方法。不过注意在 c = a + b 表达式中a是调用对象,b是作为参数被传入的对象。
二、重载限制
1、重载的操作符(部分例外)不必是成员函数,但重载的操作符至少得有一个是用户自定义的类,这是为了防止用户为标准类型重载操作符,例如将两个整数的加法重载为乘法之类的;
2、使用重载操作符不能违反原来的语法,例如不能把二元操作符重载为一元操作符。同样不能改变其优先级。
3、不能定义新的操作符。
4、并非所有的操作符都能被重载,下表是一些常用的能被重载的操作符:
5、大多数操作符都能通过成员或非成员函数重载,但以下的操作符只能通过成员函数重载:
假若我们重载了加法操作符,使得其 A + 3能正常使用,那么如果是3 + A 呢?因为重载时规定加号左边是对象右边是int,所以3 + A是非法的。如何解决呢?一般是使用友元。
三、友元
友元有三种:友元类,友元函数,友元成员函数,下面先介绍友元函数。
1、友元函数的创建: 加上friend关键字,注意参数的数量。注意,该原型的声明以为着两点:
(1)虽然friend operator * (...)函数中声明的,但它不是成员函数,因此不能用使用成员操作符来调用;
(2)虽然友元函数不是成员函数,但它的访问权限跟成员函数的相同。
(3)友元函数的声明放在公有段和私有段都一样。
2、友元函数的实现:
实际上,可以通过下面的修改将友元函数写成非成员函数(即不用再类定义里声明):
3、友元函数与成员函数的区别:
(1)成员函数有this指针,而友元函数没有this指针;
(2)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。
//End.