5

我们这些已经看到 STL 之美的人尝试尽可能多地使用它,并鼓励其他人在我们看到他们使用原始指针数组的任何地方使用它。Scott Meyers写了一整本关于 STL 的书,标题为Effective STLifstream然而,他们更喜欢的开发人员发生了char*什么std::string。我想知道为什么的第一个参数ifstream::open()是 type const char*,而不是const std::string &. 请看一下它的签名:

void open(const char * filename, ios_base::openmode mode = ios_base::in );

为什么这个?为什么不这样:

void open(const string & filename, ios_base::openmode mode = ios_base::in );

这是设计的严重错误吗?还是这个设计是故意的?可能是什么原因?我看不出他们为什么char*偏爱std::string. 请注意,我们仍然可以传递char*给采用std::string. 这不是问题!

顺便说一句,我知道这ifstream是一个 typedef,所以不要对我的标题发表评论。:P。它看起来很短,这就是我使用它的原因。

实际的类模板是:

template<class _Elem,class _Traits> class basic_ifstream;
4

3 回答 3

7

因为 IOStream 是在 STL 的一部分集成到标准库之前设计的。字符串类是在那之后制作的。在标准化过程中已经很晚了,修改 IOStream 不被认为是保存。

顺便说一句,作为 C++0X 中较小但方便的更改的一部分,对这类事情进行了清理。

于 2011-01-09T16:45:52.203 回答
4

我的标准副本不同意你的观点。它说这两个都是重载:

void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const string& s, ios_base::openmode mode = ios_base::in);

但是,该标准的副本是该标准的下一版本 C++0x 的草案。

这样做的原因是iostreams图书馆早于std::basic_string,并且因为图书馆设计者不希望有人必须#include <string>使用它,如果他们不想使用它,所有这些都是其他相关的包袱。

于 2011-01-09T16:46:48.363 回答
0

从 a 获取 C 字符串通常不会std::string比从 C 字符串构造 a更昂贵,std::string因此,考虑到您可能希望使用std::ifstream来自两者的文件名,const char*在接口中使用 a 并不是很大的成本.

这是设计的严重错误吗?

当前界面不能做什么?const std::string&界面产量会带来哪些具体而显着的好处?

std::string在我看来,重载的真正好处是帮助初学者在第一次尝试一起使用 std::string 和流时轻松搞定。.c_str()对于有经验的 C++ 开发人员而言,与开发代码的其他工作相比,必要时编写的微不足道的成本可能可以忽略不计。

于 2011-01-09T17:03:42.133 回答