为什么std ::(i | o)fstream类的构造函数和open
方法以const char*
而不是{{的形式将文件名作为参数1}?似乎STL的创建者想要使用他们编写的内容而不是使用他们编写的类来替换它。
答案 0 :(得分:13)
图书馆的string
部分是在溪流之后开发的,没有人想过做出明显的修改。
只是出于政治和时间的现实,他们在发布C ++ 98之前从未解决过这个问题,并且没有人再次提起它,因为你总能用.c_str()
来解决它。
C ++ 0x解决了这个问题(见27.9.1.6)。
欢迎使用C ++。
答案 1 :(得分:6)
据我所知,这主要是出于历史原因。在ifstream
之前很久就存在ofstream
和std::string
。他们当时甚至没有std::
。
答案 2 :(得分:4)
类std::string
实现了“运行时大小可调整大小的字符串”的概念。这是应该使用这个类的时候 - 当你需要一个字符串,其大小只在运行时已知,并且运行时也可以调整大小。在使用std::string
不需要这些功能的情况下,这是一种过度杀伤力。显然,该库的作者并不认为他们需要一个运行时可调整大小的字符串来表示文件名,因此他们选择了一个简约的解决方案:他们使用了C字符串,其中C字符串就足够了。这实际上是设计库接口的一个非常好的原则:永远不需要你真正不需要的东西。
现在,我们经常看到有人鼓励C ++程序员在需要字符串,任何字符串时使用std::string
。他们经常声称应该为C代码保留经典的C字符串。一般情况下,这是一种虚假的哲学。无偿使用像std::string
这样的比较重的对象更适合像Java这样的语言,但在C ++中通常是不可接受的。
是的,可以在某些C ++应用程序中始终使用std::string
(“可以用C ++编写Java程序”),但是在这样的通用低级库中C ++标准库强制用户在没有充分理由的情况下使用std::string
(即强加不必要的要求)看起来不太好。
答案 3 :(得分:3)
我敢打赌,iostream
层次结构/图书馆(包括(i|o)fstream
)是std::string
以外发明/开发的,他们只是在std
汇总时才第一次见面图书馆
在发明iostream
时,可能会有许多不同的string
实现并支持最大可移植性,他们决定押注一个始终可用的数据类型,这是一个简单的{{1 c-style string。
答案 4 :(得分:2)
只是查看我的G ++的<fstream>
标题,我注意到std::basic_string
或其typedefs
的所有引用都在以#ifdef __GXX_EXPERIMENTAL_CXX0X__
分隔的部分中。
这告诉我,iostreams库被设计为独立于字符串库,所以如果你没有使用std::string
,你就不需要为此付费(这在历史上一直是C ++中非常重要的设计原则)。这也可以解释为什么getline(std::istream&, std::string&)
是<string>
中定义的自由函数,而不是像istream::getline(char*, streamsize)
这样的成员函数。
这也暗示我在C ++ 0x标准化中将此视为设计缺陷,并认为使iostreams库独立于字符串库的不便并不值得。
(我无法找到C ++ 0x规范的工作草案,或系统地检查所有与iostream相关的标头以确认其中的任何一个。)