C++ 流的拷贝

遇到一个优点意思的代码段:

#include <iostream>
#include <fstream>

std::ofstream make_stream(){

    std::ofstream out;
 
    std::cout.fill ('*');
    std::cout.width (20);
    out.copyfmt(std::cout); //如函数名所表达的,只拷贝“格式化设定”信息,如填充字符,补充宽度等
    
    out.clear(std::cout.rdstate()); // 复制 rdstate
    out.basic_ios<char>::rdbuf(std::cout.rdbuf()); // 共享缓冲
    
    return out;
}

int main() {
    make_stream() <<  "Hello, world\n";
}

       返回一个ofstream对象,是否意味着拷贝一个文件输出流对象?流对象的拷贝意味着什么?考虑操作系统的文件,读写文件涉及到缓冲区刷新和偏移量变化等问题。ofstream对象可以理解为封装了文件句柄(我们通过操作系统的文件句柄访问文件)的东西,当我们由ofstream a拷贝出另一个ofstream b=a;如果设计成共享相同的文件句柄,则面临状态变化同步的难题。如果设计成b重新打开一个文件,则明显与拷贝语义不符。所以最终设计决策是,流不能拷贝。

      代码段中的返回临时对象ofsteam是否意味着拷贝呢?实际上C++11开始,支持move copy,move语义有转移所有权的意思。函数内的那个std::ofstream out对象被掏空了。

       这段代码还告诉我们另一个意思,如果要复制一个流,只需要复制三个东西:格式化设置,错误状态位,流缓冲。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值