字符串中的字符数组指针与字符串引用

时间:2010-01-29 22:28:57

标签: c++ string function argument-passing

我经常看到以下结构,特别是在构造函数中:

class::class(const string &filename)
{
}


class::class(const char * const filename)
{
}

通过逐步调试,我发现如果我传递一个硬编码的字符串,总会调用第二个构造函数。

任何想法:

1)为什么使用双重结构?

2)什么是速度差异?

感谢。

4 个答案:

答案 0 :(得分:3)

需要两个构造函数,因为您可以将NULL传递给MyClass::MyClass(const std::string &arg)。提供第二个构造函数可以避免愚蠢的崩溃。

例如,您为您的类编写构造函数,并使其成为const std::string &,这样如果您使用const char*,则不必检查任何指针是否有效。 在代码中的任何地方,您只使用std::string。在某些时候,你(或另一个程序员)在那里传递const char*。这里有std::string的很好的部分 - 它有一个构造函数,它取char*,这是非常好的,除了事实,std::string a_string(NULL)编译没有任何问题,只是不起作用

这就像你所展示的第二个构造函数一样方便:

MyClass::MyClass(const char* arg)
    : m_string(arg ? arg : "")
{}

如果您将std::string传递给它,它将生成有效的NULL对象。

在这种情况下,我认为你不必担心任何速度。你可以尝试测量,虽然我担心你会感到惊讶的是它会有多少差异(如果有的话)。

编辑:刚试过std::string a_string(NULL);,编译得很好,这就是在我的机器上运行时会发生什么(OS X + gcc 4.2.1)(我记得我曾经在Windows上试过它,如果不完全相同,结果非常

std::logic_error: basic_string::_S_construct NULL not valid

答案 1 :(得分:1)

如果实现本身处理const char* s,但这主要由std::string用户调用,则此功能非常有用。这些可以使用std::string API调用,通常只调用c_str()并调度到const char*实现。另一方面,如果调用者已经有一个c字符串,则不需要构造临时或不需要的std::string(这可能是昂贵的,对于更长的字符串,它是堆分配)。

另外,我曾用它来解决以下情况:

我的界面花了std::string,但必须在外部模块中实现,因此模块和调用者模块的STL二进制版本必须完全匹配 ,或者它会崩溃(对于便携式库来说并不是很好......)。所以我更改了实际界面以使用const char*,并添加了我声明为std::string的{​​{1}}重载,因此未导出它们。它没有破坏现有的代码,但解决了我所有的模块边界问题。

答案 2 :(得分:0)

  

1)为什么使用双重结构?

如果要将std :: string对象方便地用作参数m,则需要字符串引用版本,因为没有从std :: string到const char const的隐式转换。 const char * const版本是可选的,因为字符数组可以隐式转换为std :: strings,但它更有效,因为不需要创建临时的std :: string。

2) What is the speed difference?

您需要自己衡量一下。

答案 3 :(得分:0)

它们基本上是为了方便而提供的。有时,如果你调用C函数,你会得到char *指针。其他人,你得到字符串,所以提供两个构造函数只是一个方便调用者。至于速度,两者的速度几乎相同,因为它们都向构造函数发送了一个内存地址。