operator<<

本文介绍了C++中重载流输出运算符<<的方法,并通过实例展示了如何使用友元函数来实现这一功能。此外,还讲解了重载位移运算符<<,用于字符串的左移操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、重载流输出运算符<<

重载流输出运算符<<,比如cout<<a;原来的形式是 operator<<(cout,a); 由于<<需要用到两个类,一个是ostream类,cout就是他的对象,是负责输出的类;另一个是用户自定义类。

所以重载是应该用 友元函数 重载。如下:

#include <iostream>

using namespace std;



class Date

{

friend ostream& operator<<(ostream&,const Date&);

  

    int year;

    int month;

    int day;

public:    

    Date() {year=2017; month=6; day=5;}

};



ostream& operator<<(ostream& out,const Date& date)

{

    out<<date.year<<'-'<<date.month<<'-'<<date.day;

    return out;

}



int main()

{

    Date date;

    cout<<date<<endl;

}

 

注意上面的ostream& operator<<(ostream& out,const Date& date)的3个引用&,

1. 第一个ostream&,返回的是ostream类对象的引用,为了进行连续的运算,如cout<<a<<b;

先进行cout<<a,运算玩了,返回cout的引用,就是返回了cout本身,原来的式子变为cout<<b;

这样就能连续写了,cout<<a<<b<<c<<........

2. 第二个ostream& out, out是随便取的名字,就是ostream类的对象,与cout用法一样,通过<<将数据传到out里,所以输出时用cout<<a,这时就调用 operator<<(cout, a), 把cout作为参数传入。对于上述例子cout<<date<<endl;,就是执行了cout<<date.year<<'-'<<date.month<<'-'<<date.day;   return cout;(注意,这里就是cout,其中year等是基本类型,c++已经写好了)

再次说明cout并不特殊,就是预先定义好了的ostream类的对象。

3. 第三个const Date&,主要为了快速出入参数,如果不用&,将会复制一个参数,而不是将原来的对象直接传入,就会调用拷贝构造函数(如果没写的话编译器自动提供),浪费时间,有时还会产生错误,比如数据成员里有指针时,编译器提供的拷贝构造函数将会自动复制一个指针,与原来的指针指向同一个地址,这样改变一个另一个也会改变,这是我们不想要的,我们需要拷贝时指针指向不同的地址,两个对象互不干扰,只是指针所指变量的值相等就行,这就需要自己写拷贝构造函数,自己new等。所以一般用&,加const防止意外修改。

 

二、重载位移

// 这个例子将字符串左移n位,然后左面补空格

using namespace std;
 
class BitString
{
public:
    BitString(char *str);
 
    const char* operator<<(int bit);
 
private:
    char m_str[200];
};
 
BitString::BitString(char *str)
{
    strcpy(m_str, str);
}
 
const char* BitString::operator<<(int bit)
{
    int len = strlen(m_str);
    if(bit >= len)
    {// 如果左移超过字符串长度,则直接至为空格即可
        for(int i = 0; i < len; ++i)
        {
            m_str[i] = ' ';
        }
        return m_str;
    }
    // 先左移字符串
    for(int i = 0; i < len - bit; ++i)
    {
        m_str[i] = m_str[i + bit];
    }
    for(int i = len - bit; i < len; ++i)
    {
        m_str[i] = ' ';
    }
    return m_str;
}
 
int main( void )
{
    BitString bs("123456");
    bs<<4;
    system("pause");
}

 

转载于:https://my.oschina.net/chaenomeles/blog/915079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值