2010-01-29 65 views
2

常常看到以下结构,特别是在构造串refrence:字符数组指针VS在PARAMS

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


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

通过一步一步的调试,我发现了第二构造函数被始终称为如果我通过一个硬编码的字符串。

任何想法:

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

2)什么是速度差?

谢谢。

回答

3

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

例如,您为您的班级编写构造函数,并使其成为const std::string &,这样如果您使用const char*,则不必检查任何指针是否有效。 在你的代码中的任何地方,你只是使用std::string s。在某个时候,你(或另一个程序员)通过那里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

+0

谢谢,这澄清了这件事! – SyBer 2010-01-31 09:41:22

0

1)为什么使用双重结构?如果的std :: string对象是因为有从一个std的隐式转换::串到一个const char const的被方便地用作parametersm

字符串参考版本是必需的。 const char * const版本是可选的,因为字符数组可以隐式转换为std :: strings,但效率更高,因为不需要创建临时std :: string。

2) What is the speed difference? 

您需要自己测量一下。

0

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

+0

相同的速度?即使采用字符串的构造函数确实与远程存储库联系并通过Google存储库通过Google翻译API下载了War和Peace的中文翻译,并且char *构造函数只是赋值了一个值? :P – 2010-01-29 22:40:03

+0

如果原始字符串是C++字符串,则性能将相同。如果原始字符串是C风格的字符串(或文字),那么只有std :: string版本将需要创建一个临时的。我的建议是在必要时使用C++字符串,但如果您发现性能瓶颈,请考虑添加额外的C风格过载。 – 2010-01-29 23:13:38

1

如果实现自己处理const char*秒,那么这很有用,但主要由std::string用户调用。这些可以使用std::string API进行调用,该API通常只调用c_str()并分派到const char*实现。另一方面,如果调用者已经有一个C字符串,则不需要构造临时或不需要的std::string(这可能是昂贵的,对于较长的字符串它是一个堆分配)。

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

我的界面了std::string的,但有一个外部模块中实现,因此,这两个模块和调用模块的STL二进制版本必须匹配,确切地说是,否则它会崩溃(对于便携式库不太好)。所以我改变了实际的界面使用const char*,并增加std::string重载,我宣称inline,所以他们没有出口。它没有破坏现有的代码,但解决了我所有的模块边界问题。