为什么STL字符串类没有内置的重载char *运算符?他们有什么特别的理由要避免吗?
如果有,那么使用带C函数的字符串类会变得更方便。
我想了解你的观点。
答案 0 :(得分:16)
以下是Josuttis STL书中的引用:
但是,没有自动类型 从字符串对象转换为 C-字符串。这是出于安全原因 防止意外的类型转换 导致奇怪的行为(类型 char *经常有奇怪的行为)和 含糊不清(例如,在 结合字符串和表达式的表达式 一个C字符串是可能的 将字符串转换为char *和副 反之亦然)。相反,有几个 创建或编写/复制的方法 C字符串,特别是c_str()是 提供以生成a的值 string作为C字符串(作为字符 最后一个'\ 0'的数组 字符)。
答案 1 :(得分:12)
你应该总是避免使用强制转换操作符,因为它们往往会在代码中引入歧义,只能通过使用进一步的强制转换来解决,或者更糟糕的是仍然编译但是没有按照你的期望进行操作。 char *()运算符会有很多问题。例如:
string s = "hello";
strcpy( s, "some more text" );
会在没有警告的情况下编译,但会破坏字符串。
const版本是可能的,但由于必须(可能)复制字符串以实现它,因此会产生不希望的隐藏成本。显式c_str()函数意味着您必须始终声明您确实打算使用const char *。
答案 2 :(得分:5)
字符串模板规范故意允许字符串的“断开连接”表示,其中整个字符串内容由多个块组成。这样的表示不允许轻松转换为char *。
但是,字符串模板还提供了c_str方法,以满足您的需要:使用该方法有什么问题?
答案 3 :(得分:2)
您可以改为使用c_str:
string s("I like rice!");
const char* cstr = s.c_str();
我相信在大多数情况下你不需要char *,并且可以更方便地使用字符串类本身。
答案 4 :(得分:2)
到1998 - 2002年,它是c ++论坛的热门话题。主要问题 - 零终结器。 std ::?string的规范允许零字符正常,但char *字符串不允许。
答案 5 :(得分:0)
如果您需要与C风格的功能互操作,使用std::vector<char>
/ <wchar_t>
通常会更容易。
这不方便,不幸的是你不能O(1) - 用std::string
来扭转它(现在 会是一件好事)。
在这方面,我更喜欢MFC / ATL CString
的接口,它具有更严格的性能保证,提供互操作,并且不会将宽字符/ unicode字符串视为完全外来的(但是好的,后者是有点平台特定)。