STD字符串类中的运算符char *

时间:2009-08-17 07:41:07

标签: c++ stl

为什么STL字符串类没有内置的重载char *运算符?他们有什么特别的理由要避免吗?

如果有,那么使用带C函数的字符串类会变得更方便。

我想了解你的观点。

6 个答案:

答案 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字符串视为完全外来的(但是好的,后者是有点平台特定)。