理解C++关键字(4)---cout和cin以及运算符重载

在用C++编写程序时,最常用的就是变量的输入输出了。在C++中,一般用cin和cout来实现变量的输入和输出。但是,cin和cout并不是C++内部定义的运算符,而分别是istream类和ostream类的对象。而且都位于std命名空间中。

在类中实现cin和cout操作时,用到了运算符“<<”的重载。

那么由此以来我们自己也可以通过重载“<<”和“>>”来实现输入输出操作。


定义MyOut类,在类中通过重载“<<”运算符实现整型变量和字符型变量的输出,并且不利用std命名空间。

#include<iostream>                        //使用c++非标准库,里面包含printf

class MyOut{
public:
    MyOut(){};           //构造函数
    ~MyOut(){};          //析构函数

    const void &operator<<(int value)const;   //输出整型变量
    const void &operator<<(char c)const;     //输出字符型变量
}
//输出整型变量
const void &MyOut::operator<<(int value)const
{
    printf("%d",value);
}
//输出字符型变量
const void &MyOut::operator<<(char c)const
{
    printf("%c",c);
}

int main()
{
    int n=5;          //声明整型变量n=5     
    MyOut myout;      //MyOut类的对象myout,可类比ostream类的cout对象
    myout<<n;         //输出n
    myout<<'\n';      //输出换行符
}

通过运行上述程序,能够得到我们期望的结果。但是,不能够连续的输出,只能一次输出一个变量

1、实现连续输出

然而,cout是能够连续输出的,它是怎么做到的呢?

我们知道,对于每一个类的成员函数(静态成员函数除外),都有一个指向当前对象的*this指针。若将运算符重载函数声明为MyOut类型,在函数中返回当前对象的this指针后,下一次在调用函数时,是在之前的基础上调用的,即实现了对对象的连续操作。

修改后,类的实现如下:

class MyOut{
public:
    MyOut(){};           //构造函数
    ~MyOut(){};          //析构函数

    const MyOut &operator<<(int value)const;   //输出整型变量
    const MyOut &operator<<(char c)const;     //输出字符型变量
}
//输出整型变量
const MyOut &MyOut::operator<<(int value)const
{
    printf("%d",value);
    return *this;
}
//输出字符型变量
const MyOut &MyOut::operator<<(char c)const
{
    printf("%c",c);
    return *this;
}

经过以上操作,可以实现基本的输出操作。当然,可以向MyOut类中添加其他的成员函数,实现更多的输出功能。比如,cout的输出宽度设定,输出数据的进制设置等等。而cin的操作与其类似。

2、endl和’\n’的区别

在C++标准库中,是利用“endl”来实现换行的,而我们自己实现时,是直接输出了换行符’\n’。那么,两者究竟有什么区别呢?
1. 首先,endl是一种定义在iostream文件中的IO操作符。
2. 在ostream类中,重载操作符<<时,有如下定义:

ostream& ostream::operator << ( ostream& (*op) (ostream&))
{
   // call the function passed as parameter with this stream   as the argument
      return (*op) (*this);
 }

而对于endl函数的实现如下:

std::ostream& std::endl (std::ostream& strm)
{
    // write newline
    strm.put('\n');
    // flush the output buffer
    strm.flush();
    // return strm to allow chaining
    return strm;
}

由上述可知,endl作为函数名,经函数指针传递给重载<<函数中的*op,从而实现对endl()函数的调用。
3. 它的作用是插入换行符并强制刷新输出缓冲区,将输出缓冲区中的数据写入文件或屏幕。
而换行符’\n’或“\n”并没有刷新缓冲区的功能。

当遇到大程序时,用“\n”换行,能够提高运行效率。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用重载运算符来定义自定义类型的输入输出操作,包括流插入运算符`<<`和流提取运算符`>>`。其中,重载流插入运算符`<<`用于将自定义类型的对象输出到输出流中。 下面是一个重载流插入运算符的示例代码: ```c++ #include <iostream> using namespace std; class MyClass { public: MyClass(int a, int b) : x(a), y(b) {} friend ostream& operator<<(ostream& os, const MyClass& obj); private: int x, y; }; ostream& operator<<(ostream& os, const MyClass& obj) { os << "MyClass(" << obj.x << ", " << obj.y << ")"; return os; } int main() { MyClass obj(1, 2); cout << obj << endl; // 输出:MyClass(1, 2) return 0; } ``` 在上面的示例代码中,我们定义了一个名为`MyClass`的自定义类,其中包含两个整型成员变量`x`和`y`。然后,我们使用`friend`关键字声明了一个友元函数`operator<<`,并在其中定义了输出操作的实现。在`main()`函数中,我们创建了一个`MyClass`对象,并使用重载的流插入运算符`<<`将其输出到标准输出流中。 需要注意的是,重载的流插入运算符的第一个参数必须是`ostream`类型的引用,它表示输出流;第二个参数必须是要输出的自定义类型的常量引用,它表示要输出的对象。重载的流插入运算符的返回值应该是`ostream`类型的引用,它表示输出流,这样可以支持链式操作。 同样的道理,我们也可以重载流提取运算符`>>`来实现自定义类型的输入操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值