C++(26)左移操作符和右移操作符

友元函数和成员函数选择的方法

  • 当无法修改左操作数的类时,使用全局函数进行重载
  • =, [], ()和->操作符只能通过成员函数进行重载

重载左移操作符

#include <iostream>

using namespace std;

class Complex
{
    friend void operator<< (ostream &out, const Complex &c);
public:
    Complex()
    {
        a = 0;
        b = 0;
    }

    Complex(int a, int b)
    {
        this->a = a;
        this->b = b;
    }

    void print()
    {
        printf ("%d + %di\n", a, b);
    }

    Complex operator+(const Complex &c2) const
    {
        Complex tmp(a+c2.a, b+c2.b);
        return tmp;
    }


private:
    int a;  // 实部
    int b;  // 虚部
};

ostream& operator<< (ostream &out, const Complex &c)
{
    out << c.a << " + " << c.b << "i";

    return out;
}

int main()
{
    Complex c1(1,2 );
    c1.print();

    // << 是一个操作符  我们可以重载它的功能
    // cout  是一个对象 cout 是 ostream 的一个对象

    // operator<< (cout, c1)  
    // operator<< (ostream &out, const Complex &c);  

    // 1、 operator<< (cout, c1)  << endl
    // 2、operator<< (operator<< (cout, c1),  endl)
    // 3、operator<< (cout,  endl)
    cout << c1 << endl;  

    // 全局 ---> 内部
    // operator<< (ostream &out, int a)   ----->  operator<< (int a)  
    // Complex * const this   ostream *const this
    // 左移和右移操作只能用友元函数进行重载,写成全局函数,无法写成内部函数,因为无法修改 ostream 类
    return 0;
}

执行结果:
    1 + 2i
    1 + 2i

类成员函数无法完成左移操作符的重载
因为拿不到cout这个类的源码
cout.operator<<(c1);


友元函数重载注意点

在第一个参数需要隐式转换的情形下,使用友员函数重载运算符是正确的选择 友员函数没有 this指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换
C++中不能用友员函数重载的运算符有:

                        =    ()    []    ->
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值