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

原创 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 ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)理解。

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),...
  • u014610226
  • u014610226
  • 2015年08月15日 09:49
  • 1875

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

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

从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载

一、运算符重载 运算符重载允许把标准运算符(如+、—、*、/、等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数...
  • Simba888888
  • Simba888888
  • 2013年07月10日 16:22
  • 8105

成员函数重载运算符和友元函数重载运算符的比较

1.对双目运算符而言,成员函数重载运算符的函数参数表中只有一个参数,而用友元函数重载运算符函数参数表中含有两个参数。   对单木运算符来说,成员函数重载运算符的函数参数表中没有参数,而用友元函数重载运...
  • u011450537
  • u011450537
  • 2014年11月13日 10:26
  • 2789

New运算符的重载

首先我们要清楚,为什么我们要重载new,和delete了?这还不是指针造成的,确实指针是一件让人喜欢的东西,用起来如此让人喜欢,让人顺手。然而小程序我们完全可以避免内存泄露问题,大程序就不那么容易了,...
  • ghevinn
  • ghevinn
  • 2014年01月16日 15:32
  • 5822

C++重载函数与重载运算符

C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声...
  • qq_28796345
  • qq_28796345
  • 2016年04月29日 16:30
  • 738

用类的成员函数,定义复数类重载运算符+、-、*、/,使之能用于复数的加减乘除

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:郭辉 *完成时间:2016年5月1...
  • guohui5011
  • guohui5011
  • 2016年05月19日 18:14
  • 2264

重载的操作符成员函数与非成员函数

今天看effective STL第26条条款时,发现自己之前没意识到如下的几点(看来自己的c++基础还是渣渣水平o(╯□╰)o)。 如果一个类重载操作符,当在全局域内也重载了同样的操作符,那么在调用该...
  • AQ14AQ1
  • AQ14AQ1
  • 2015年11月03日 22:37
  • 1425

运算符重载为成员函数

运算符重载实质上就是通过函数重载,重载为成员函数,它就可以自由的访问本类的数据成员,实际使用时,总是通过该类的某个对象来访问重载的运算符。如果是双目运算符,左操作数是对象本身的数据,由this指针指出...
  • StubbornAccepted
  • StubbornAccepted
  • 2016年05月10日 20:14
  • 1075

c++ 类的使用 友元函数 重载运算符

#ifndef S_H_ #define S_H_ #include "iostream" class s { private: int minutes; int hours; public: ...
  • qq_25235869
  • qq_25235869
  • 2016年03月25日 15:53
  • 1207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:部分运算符只能用友元函数(全局函数)重载 以及链式法则
举报原因:
原因补充:

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