【发布时间】:2014-07-26 20:37:47
【问题描述】:
在 C++ 中,我可以编写一个带有 std::string 参数的构造函数的类。由于隐式转换,这将允许我从 std::string 或 char * 构造此类的实例。
有没有理由同时拥有std::string 构造函数和char * 构造函数?
class MyStringClass {
public:
MyStringClass( const std::string &str ); // char *'s could implicitly use this constructor
MyStringClass( const char * str ); // would this ever be necessary?
};
这个问题也适用于函数参数。
void do_stuff_with_string( const std::string &str );
void do_stuff_with_string( const char * str );
编辑:
为了澄清,我想知道更多关于性能的信息。假设这些构造函数/函数正在调用只接受char * 的api。如果我不需要的话,是否值得拥有两个独立的函数来避免构造 std::string?
void do_stuff_with_string( const std::string &str )
{
do_stuff_with_string( str.c_str() );
}
void do_stuff_with_string( const char * str )
{
// call some api that only accepts char *
}
【问题讨论】:
-
显而易见的原因是如果您想以不同的方式处理它们。当然,还有其他原因,如果不简单地提供一个清单,就很难回答这个问题。你能告诉我们更多关于你想要做什么的信息吗?
-
@CodyGray 我想我更多地询问性能方面的问题。是否值得同时避免构造一个字符串(如果在函数内部我只使用 .c_str() 方法,例如),还是开销如此之小我不应该担心?
-
@CodyGray 正如您自己指出的那样,您保存的是字符串的构造。该开销是否“分钟”取决于该类在您的程序中的使用方式,因此通常很难在这里回答。
-
如果你有一个 const char* 字符串,那么这绝对是一个有问题的设计,然后创建(通过隐式转换)一个 const std::string& from它,并最终通过 std::string::c_str() 将其传递给具有 const char* 接口的某些 C-API。有关详细信息,请参阅下面的答案。
标签: c++ string function class implicit-conversion