【c++】iostreeam中的类为何不可以直接定义一个无参对象呢

简介:

缘起

复制代码
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
 
int main()
{
   ofstream fs;          //输出文件流  (正确)
   ostringstream os;     //输出string流(正确)
   ostream o;            //输出普通流   (错误)
}
复制代码

解惑

头文件iostream定义了三个类iostream, istream, ostream(三个普通流), 都存在这样的问题:不可以直接定义无参数的对象。原因可以从编译器提示看出

       

 

类中无参数的构造函数定义为protected,因此不可直接定义。

为何这么设计

iostream头文件定义读写控制窗口的类型,c++是跨平台的语言,不同的系统窗口操作是不同的,用户自己定义有些费劲,于是c++干脆定义了标准的输入对象cin,标准的输出对象cout。反正只是与窗口交互自己再去定义输入输出对象也没那必要。

非得自己定义一个iostream对象可以吗?

可以,有有参数的构造函数,两个例子

#ostream对象

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <fstream>
int  main () {
   std::filebuf fb;
   fb.open ( "test.txt" ,std::ios::out);
   std::ostream os(&fb);
   os <<  "Test sentence\n" ;
   fb.close();
   return  0;
}

#istream对象

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
int  main () {
   std::filebuf fb;
   if  (fb.open ( "test.txt" ,std::ios::in))
   {
     std::istream is(&fb);
     while  (is)
       std::cout <<  char (is.get());
     fb.close();
   }
   return  0;
}

  



本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3462254.html,如需转载请自行联系原作者

相关文章
|
1天前
|
C++ Linux
|
1天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
1天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
16 0
|
1天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
16 0
【C++】string学习 — 手搓string类项目
|
1天前
|
Java C++ Python
【C++从练气到飞升】06---重识类和对象(二)
【C++从练气到飞升】06---重识类和对象(二)
|
1天前
|
编译器 C++
【C++从练气到飞升】06---重识类和对象(一)
【C++从练气到飞升】06---重识类和对象(一)
|
1天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
17 0
|
1天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
21 1
|
1天前
|
存储 编译器 C语言
【C++从练气到飞升】02---初识类与对象
【C++从练气到飞升】02---初识类与对象