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.

  

 

 

 

 

 

 

 

 

 

 

  

 

posted @ 2016-03-24 23:31  Vincent_Bryan  阅读(3751)  评论(0编辑  收藏  举报