常常看到以下结构,特别是在构造串refrence:字符数组指针VS在PARAMS
class::class(const string &filename)
{
}
class::class(const char * const filename)
{
}
通过一步一步的调试,我发现了第二构造函数被始终称为如果我通过一个硬编码的字符串。
任何想法:
1)为什么使用双重结构?
2)什么是速度差?
谢谢。
常常看到以下结构,特别是在构造串refrence:字符数组指针VS在PARAMS
class::class(const string &filename)
{
}
class::class(const char * const filename)
{
}
通过一步一步的调试,我发现了第二构造函数被始终称为如果我通过一个硬编码的字符串。
任何想法:
1)为什么使用双重结构?
2)什么是速度差?
谢谢。
需要两个构造函数,因为您可以将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
1)为什么使用双重结构?如果的std :: string对象是因为有从一个std的隐式转换::串到一个const char const的被方便地用作parametersm
字符串参考版本是必需的。 const char * const版本是可选的,因为字符数组可以隐式转换为std :: strings,但效率更高,因为不需要创建临时std :: string。
2) What is the speed difference?
您需要自己测量一下。
它们基本上为了方便而提供。有时候,如果你调用C函数,你会得到char *指针。其他人,你会得到字符串,所以提供这两个构造函数对调用者来说只是一个方便。至于速度,两者实际上具有相同的速度,因为它们都向构造函数发送内存地址。
相同的速度?即使采用字符串的构造函数确实与远程存储库联系并通过Google存储库通过Google翻译API下载了War和Peace的中文翻译,并且char *构造函数只是赋值了一个值? :P – 2010-01-29 22:40:03
如果原始字符串是C++字符串,则性能将相同。如果原始字符串是C风格的字符串(或文字),那么只有std :: string版本将需要创建一个临时的。我的建议是在必要时使用C++字符串,但如果您发现性能瓶颈,请考虑添加额外的C风格过载。 – 2010-01-29 23:13:38
如果实现自己处理const char*
秒,那么这很有用,但主要由std::string
用户调用。这些可以使用std::string
API进行调用,该API通常只调用c_str()
并分派到const char*
实现。另一方面,如果调用者已经有一个C字符串,则不需要构造临时或不需要的std::string
(这可能是昂贵的,对于较长的字符串它是一个堆分配)。
另外,我曾经用它来解决以下情况:
我的界面了std::string
的,但有一个外部模块中实现,因此,这两个模块和调用模块的STL二进制版本必须匹配,确切地说是,否则它会崩溃(对于便携式库不太好)。所以我改变了实际的界面使用const char*
,并增加std::string
重载,我宣称inline
,所以他们没有出口。它没有破坏现有的代码,但解决了我所有的模块边界问题。
谢谢,这澄清了这件事! – SyBer 2010-01-31 09:41:22