为什么C++11中
难道写
<string>
头文件的新函数(stod
, stof
, stoull
)不是string
类的成员函数?难道写
mystring.stod(...)
而不是stod(mystring,...)
不符合更多的C++规范吗?<string>
头文件的新函数(stod
, stof
, stoull
)不是string
类的成员函数?mystring.stod(...)
而不是stod(mystring,...)
不符合更多的C++规范吗?许多人感到惊讶,但是C++ 不是 面向对象的语言(与Java或C#不同)。
C++是一种多范式语言,因此尽可能使用最好的工具来完成任务。在这种情况下,自由函数 是正确的工具。
指导原则: 优先选择非成员函数而不是成员函数(来自Efficient C++,第23条)
原因: 成员函数或友元函数可以访问类内部,而非成员函数不能; 因此,使用非成员函数可以增加封装性。
例外: 当成员函数或友元函数提供显着优势时(例如性能),尽管存在额外的耦合,但仍值得考虑。例如,即使std::find
运行良好,但关联容器(例如std::set
)提供了一个成员函数std::set::find
,它以O(log N)的速度工作,而不是O(N)。
std::basic_string
的话... - pmrstd::basic_string
和所有IO流都是存在于标准化之前的恐龙;实际上,最初版本的string
完全是基于索引定义的,在标准化过程中添加了所有迭代器重载以使其成为一个序列...但是为了兼容性,前面的方法被保留了。 - Matthieu M.
std::string
已经有太多成员函数了。请参见单体结构"解绑"的 GOTW。 - juanchopanzastod
是一个可以接受任何Sequence
对象而不仅仅是std::string
的模板,那就太好了。 - Siler