C++流是如何工作的? [英] How do C++ streams work?

查看:0
本文介绍了C++流是如何工作的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道流类在C++中是如何工作的。当你说:

cout<<"Hello
";

具体做什么。我知道cout是iostream形式的对象,它表示面向窄字符(Char)的标准输出流。

在C"<;<;"中是位移位操作符,因此它将位向左移动,但在C++中它是AND插入操作符。嗯,我只知道这些,我真的不明白这是怎么在幕后运作的。

我要求的是关于C++中的流类的详细说明,以及它们是如何定义和实现的。

非常感谢您抽出时间,并为我的英语道歉。

推荐答案

让我们创建一个类似cout(但没有那么多花哨)的类。

#include <string>

class os_t {
    public:
        os_t & operator<<(std::string const & s) {
            printf("%s", s.c_str());
            return *this;
        }
};

int main() {
    os_t os;

    os << "hello
";
    os << "chaining " << "works too." << "
";
}

备注:

  • operator<<是运算符重载,就像operator+或所有其他运算符一样。
  • 链接之所以有效,是因为我们返回自己:return *this;

如果因为其他人编写了os_t类而无法更改它,该怎么办?

我们不必使用成员函数来定义此功能。我们也可以使用免费功能。让我们也来展示一下:

#include <string>

class os_t {
    public:
        os_t & operator<<(std::string const & s) {
            printf("%s", s.c_str());
            return *this;
        }
};

os_t & operator<<(os_t & os, int x) {
    printf("%d", x);
    return os;

    // We could also have used the class's functionality to do this:
    // os << std::to_string(x);
    // return os;
}

int main() {
    os_t os;

    os << "now we can also print integers: " << 3 << "
";
}

运算符重载还有什么用处?

在GMP库中可以找到这种逻辑如何有用的一个很好的例子。这个库被设计成允许任意大的整数。我们通过使用自定义类来实现这一点。这里有一个它的用法的例子。请注意,运算符重载让我们可以编写与使用传统int类型时几乎相同的代码。

#include <iostream>
#include <gmpxx.h>

int main() {
    mpz_class x("7612058254738945");
    mpz_class y("9263591128439081");

    x = x + y * y;
    y = x << 2;

    std::cout << x + y << std::endl;
}

这篇关于C++流是如何工作的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆