调用了哪个字符串构造函数?
Which string constructor is invoked?
我知道这是初始化,但我很困惑在每种情况下使用字符串文字时调用了 2 个构造函数中的哪一个。它们都是拷贝构造函数吗?
string::string(const string& strString)
string::string(const char *szCString)
案例一:
string sSource("my string");
案例2:
const char *szSource("my string");
你可以 check what the compiler does (GodBolt.org):
对于第一种情况,调用的构造函数是:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)
或者,换句话说,如果我们忽略分配器引用参数的默认值,它是:
std::string::string(char const*)
对于第二种情况,没有调用字符串构造函数。你只会得到:
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
将指针指向原始字符的位置。
现在,我认为您感到困惑的是字符串文字的语义。 字符串文字 不是 std::string
s!请记住,C++ 作为一种语言 而不是 具有固有的字符串类型; std::string
来自标准库。
那么什么是字符串文字的类型?这是一个字符数组。 See for yourself(Coliru.com;该示例包含将类型名称作为字符串获取的代码)
我知道这是初始化,但我很困惑在每种情况下使用字符串文字时调用了 2 个构造函数中的哪一个。它们都是拷贝构造函数吗?
string::string(const string& strString)
string::string(const char *szCString)
案例一:
string sSource("my string");
案例2:
const char *szSource("my string");
你可以 check what the compiler does (GodBolt.org):
对于第一种情况,调用的构造函数是:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&)
或者,换句话说,如果我们忽略分配器引用参数的默认值,它是:
std::string::string(char const*)
对于第二种情况,没有调用字符串构造函数。你只会得到:
mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
将指针指向原始字符的位置。
现在,我认为您感到困惑的是字符串文字的语义。 字符串文字 不是 std::string
s!请记住,C++ 作为一种语言 而不是 具有固有的字符串类型; std::string
来自标准库。
那么什么是字符串文字的类型?这是一个字符数组。 See for yourself(Coliru.com;该示例包含将类型名称作为字符串获取的代码)