部分运算符只能用友元函数(全局函数)重载 以及链式法则

原创 2015年07月10日 12:46:57

有些运算符只能用友元函数(全局函数)重载,无法使用成员函数重载,如

class Complex
{
public:
                 Complex()
                {

                }
                 Complex(int a,int b)
                {
                                 this->a = a;
                                 this->b = b;
                }
                 friend void operator << (ostream & out, Complex C); 
//这里不加引用就会报函数已删除的错误,原函数返回值当左值必须返回一个引用,见图1
protected:
private:
                 int a ;
                 int b ;
};
void operator << (ostream &out, Complex C)
{
                 out << C .a << C.b ;
}

void main ()
{
                 Complex c1 (1, 2);
                 cout << c1 ;
                 system("pause" );
}

图1,不加引用报错:
这里写图片描述

如改成员函数:

则应写为

cout. operator <<(RightOp)

“<<”重载如果想放在成员函数中实现,那就意味着必须作为cout的成员函数,但是cout已经封装好,这里明显是不现实的。

那如果放在Complex成员函数中呢?如:

class Complex
{
public:
                 Complex()
                {

                }
                 Complex(int a,int b)
                {
                                 this->a = a;
                                 this->b = b;
                }
                void operator << (Complex C)
                {

                }
protected:
private:
                 int a ;
                 int b ;
};

我们知道其中隐含的this指针指向的对象如 c1 必须作为左操作数,而在重载函数(void operator << (RightOp))之中他自身又必须作为右操作数,将变成 c1 << c1 这样是不正确的。

所以有些运算符只能用只能用友元函数(全局函数)重载。

引申(链式法则):
上面重载操作时只是采用了简单处理,让其返回void类型

void operator << (ostream &out, Complex C)
{
                 out << C .a << C.b ;
}

但是如果遇到的情况稍微复杂一点,必然会出现一些问题,如:

 cout <<  c1 << "abcd";   

因为上述重载中左操作数为cout,右操作数为c1,而后半部分左操作数为c1,右操作数为“abcd”,虽然我们知道“abcd”常量字符串会返回一个字符串指针,但是此处还可能是跟着各种变量等,所以为了避免反复构造不同的重载,这里我们可以使用链式法则,这样即使后面接 endl 或者其他Complex对象,依然可以正常调用。

为了解决这个问题,我们把问题先拆分成两个简单步骤:

 operator  << (cout ,c1);   //转化为函数调用形式
 cout<< "abcd";

如果想要链式的进行,则使(operator << (cout ,c1) ; )返回cout 即可。

(cout << c1 )<< “abcd”; ====> cout<< “abcd”;

这样即可链式的传递下去。

具体重载方法:

ostream& operator << (ostream &out, Complex C)
{
                 out << C .a << C.b ;    //此处可以不加endl,因为调用时使用 cout <<  c1 << endl; 比较符合习惯   
                 return out ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

const修饰函数参数 const修饰函数返回值 const修饰成员函数

看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的...

虚继承原理详解及实例分析

虚继承原理详解及实例分析

第八周项目一 2用友元函数实现复数类中的运算符重载

/* *Copyright (c)2014,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:test.cpp *作 者:徐洪祥 *完成日期:201...

浅谈C++中用友元函数的方法实现复合运算符(+=等)的重载方法

在写到重载复合运算符的题目时,用成员函数的方法比较容易实现。但是题目中还要求使用友元函数的方法实现,于是就卡在这里了。调试了数次后未果,于是上网翻阅资料,发现网上关于使用友元函数的方法实现复合运算符的...

飛飛(四十三)复数类中的运算符重载(用友元函数编写)

重载双目运算符可以用友元或者成员函数,但是两者有区别的, 例如用成员函数重载了 + 之后 ob = ob + 100是被支持的,而ob = 100 + ob就是不被允许的 这种情况下就要使用友元函数来...

漫步微积分十——复合函数和链式法则

考虑下面函数的导数 y=(x3+2)5(1)\begin{equation} y=(x^3+2)^5\tag1 \end{equation}根据目前现有的工具,我们可以利用二项式定理将函数展开成多项...

流运算符为什么不能重载为成员函数,只能用友元函数重载

一、 为什么operator 如果是重载双目操作符(即为类的成员函数),就只要设置一个参数作为右侧运算量,而左侧运算量就是对象本身。。。。。。 而 >>  或 如果一定要声明为成员函数,只...

运算符重载友元函数实例

  • 2016年08月17日 21:37
  • 5KB
  • 下载

C++: 运算符重载(一)、友元函数、链式编程支持

成员函数方法进行运算符重载 友元函数方法进行运算符重载 链式编程 示例程序...
  • mr_ahke
  • mr_ahke
  • 2016年08月04日 20:08
  • 79
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:部分运算符只能用友元函数(全局函数)重载 以及链式法则
举报原因:
原因补充:

(最多只允许输入30个字)