c++11 标准模板(STL)(std::basic_istream)(三)

定义于头文件 <istream>
template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_istream : virtual public std::basic_ios<CharT, Traits>

 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式的输入(例如整数值或空白符分隔的字符与字符串)和无格式输入(例如未处理字符和字符数组)。此功能以通过 basic_ios 基类访问的底层 basic_streambuf 类所提供的接口实现。大多数库实现中, basic_istream 有一个非继承数据成员:用于存储 basic_istream::gcount() 所返回的值。

成员函数

构造对象

std::basic_istream<CharT,Traits>::basic_istream

explicit basic_istream( std::basic_streambuf<CharT, Traits>* sb);

(1)

protected:
basic_istream( const basic_istream& rhs ) = delete;

(2)(C++11 起)

protected:
basic_istream( basic_istream&& rhs );

(3)(C++11 起)

 1) 构造 basic_istream 对象,通过调用 basic_ios::init(sb) 赋初始值给基类。初始化 gcount() 的值为零。

2) 复制构造函数为受保护,且被删除。输入流不可复制。

3) 移动构造函数从 rhs 复制 gcount() 的值,设置 rhs 的 gcount() 值为零,并使用 basic_ios<CharT, Traits>::move(rhs)rhs 移动所有 basic_ios 成员,除了 rdbuf()*this 中。此移动构造函数受保护:它为可移动输入流类 std::basic_ifstream 和 std::basic_istringstream 的移动构造函数调用,它们知道如何正确地移动关联流缓冲。

参数

sb-用作底层设备的流缓冲

调用示例

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream s1("hello");
    std::istream s2(s1.rdbuf());                        // OK : s2 与 s1 共享缓冲

//    std::istream s3(std::istringstream("test"));      // 错误:移动构造函数为受保护
//    std::istream s4(s2);                              // 错误:复制构造函数被删除
    std::istringstream s5(std::istringstream("world")); // OK :导出类调用移动构造函数

    std::cout << s2.rdbuf() << ' ' << s5.rdbuf() << '\n';
}
 输出

 

析构对象

std::basic_istream<CharT,Traits>::~basic_istream

virtual ~basic_istream();

析构输入流。

注意

此析构函数不在底层流缓冲( rdbuf() )上进行任何操作:导出输入流,如 std::basic_ifstream 和 std::basic_istringstream 的析构函数负责调用流缓冲的析构函数。

 调用示例

#include <sstream>
#include <iostream>

void print_stringbuf(std::streambuf* p)
{
    std::istream buf(p); // buf 与 s1 共享缓冲
    int n;
    buf >> n;
    std::cout << n;
} // 调用 buf 的析构函数。 p 保持不受影响

int main()
{
    std::istringstream s1("10 20");
    print_stringbuf(s1.rdbuf());
    int n;
    s1 >> n;
    std::cout << ',' << n << '\n';
}
输出

从另一 basic_istream 移动赋值

std::basic_istream<CharT,Traits>::operator=

protected:
basic_istream& operator=( const basic_istream& rhs ) = delete;

(1)

protected:
basic_istream& operator=( basic_istream&& rhs );

(2)(C++11 起)

 1) 复制赋值运算符受保护且被删除。输入流不可复制赋值 (CopyAssignable) 。

2) 移动赋值运算符和 rhs 交换 the gcount() 值和所有基类的数据成员,除了 rdbuf() ,如同以调用 swap(*rhs) 。此移动赋值运算符为受保护:它只为导出的可移动输入流类 std::basic_ifstream 和 std::basic_istringstream 的移动赋值运算符调用,它们知道如何正确地移动赋值关联的流缓冲。

参数

rhs-要赋值给 *this 的 basic_istream 对象

调用示例

#include <sstream>
#include <iostream>
 
int main()
{
    std::istringstream s1;
    s1 = std::istringstream("test"); // OK
 
    std::cin = std::istringstream("test"); // 错误: 'operator=' 为受保护
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值