且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-16 10:56:34

缘起

【c++】iostreeam中的类为何不可以直接定义一个无参对象呢
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
 
int main()
{
   ofstream fs;          //输出文件流  (正确)
   ostringstream os;     //输出string流(正确)
   ostream o;            //输出普通流   (错误)
}
【c++】iostreeam中的类为何不可以直接定义一个无参对象呢

解惑

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

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

 

类中无参数的构造函数定义为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,如需转载请自行联系原作者