c++构造函数和隐式字符串转换
C++ constructors and implicit string conversion
在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 );
编辑:澄清一下,我想知道更多关于性能的问题。假设这些构造函数/函数正在调用api,只接受char *
。有两个独立的函数,以避免构建一个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 *
}
如果您希望以不同的方式处理C-string和std::string
,则需要重载构造函数。
MyStringClass::MyStringClass( const std::string &str )
{
// Do std::string-specific stuff here.
}
MyStringClass::MyStringClass(const char * str )
{
// Do char* specific stuff here.
}
也有可能const char *
的形参不是以空结尾的c字符串,而是指向单个字符的指针,或者指向非以空结尾的字符数组。在这种情况下,隐式转换可能失败。
的例子:
#include <iostream>
int DoStuff(const std::string &myString)
{
std::cout << myString << std::endl;
}
int main()
{
DoStuff("This is a null terminated c-string"); // Fine!
char charArray[] = { 'A', 'B', 'C' }; // Not null terminated!
DoStuff(charArray); // Uh oh!
}
上面的例子是针对函数的,但同样也可以应用于构造函数。上面的示例编译时没有警告!
在性能方面,由于std::string(const char * const)
构造函数将c-string复制到它自己的内部缓冲区中,因此肯定会受到影响。然而,在大多数情况下,这种影响可以忽略不计,因为复制是非常有效的。但是,对于非常大的字符串,这可能是一个问题。
作为一般规则,尽量使用c++字符串,并在需要C风格字符串时使用std::string::c_str()
成员。偶尔将字符串从char*
复制到std::string
在大多数情况下将是一个微优化。只有在性能非常关键的代码中,这才是一个潜在的问题。
是的,假设您想从构造函数中释放char *
字符串所占用的内存。在这种情况下,您需要两个不同的构造函数。
如果您使用的C API需要(const) char*函数参数,您通常(也)希望提供(const) char* C风格接口。
例如,为Iconv(3)考虑一个RAII包装器Iconv。在Iconv的初始化中,你需要换行iconv_t iconv_open(const char* tocode, const char* fromcode);
你真的希望Iconv的 (only)构造函数是
吗?Iconv(const std::string& tocode, const std::string& fromcode);
特别是如果你的参数(tocode, fromcode)很可能来自命令行(argv)?
在这种情况下,我将定义相应的c风格构造函数,为了方便,可能还定义前面的构造函数(然后通过std::string::c_str()调用c风格构造函数)。
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 如何将这个std::字符串转换为std::基本字符串
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 如何在C++中将十六进制字符串转换为文本数据
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何从字符串转换为双精度*
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 如何在C++中将 Python 字符串转换为其转义版本?
- 如何在 C++11 中将标准::字符串转换为标准::u32字符串?
- 如何将整数字符串转换为整数的二维向量?
- 使用 "stringstream " 将字符串转换为整数
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 将文件复制到自定义位置,存在字符串转换问题
- 将ANSI C字符串转换为UNICODE
- 如何将节点 V8 字符串转换为 C++ 字符串
- 在C++中将字符串转换为双精度,而无需科学记数法
- 使用从文件(stod、strtod、atof)中提取的数据C++从字符串转换为双精度.csv
- 如何在C++中将字符串转换为双精度?
- 将字符串转换为无符号字符数组/字节数组