我使用的是哪个std::string构造函数?是否存在未定义行为?
std::string构造函数相关问题解答
构造函数确认
你猜的完全正确,string str(s);调用的就是接收const char*的构造函数(也就是你提到的第4个),它会把传入的以空字符\0结尾的C风格字符串完整复制到std::string对象里。
调试器显示的误区
C语言标准明确规定,像"abc"这样的字符串字面量,编译器会自动在末尾追加一个\0作为结束标志。你在Qt Creator调试器里看不到这个空字符,只是调试器的显示逻辑导致的——大多数调试器在展示C字符串时,默认只显示到第一个\0之前的内容,不会把末尾的空字符可视化出来,并不是它真的不存在。
你可以直接通过代码验证:比如打印(int)s[3],结果应该是0(也就是'\0'的ASCII值),所以你的代码完全符合标准,没有进入未定义行为的范畴。
是否需要改用带长度的构造函数
完全没必要。string str(s);的写法是标准、安全且可读性更好的,只要s指向的是合法的以\0结尾的C字符串(比如你代码里的字符串字面量),就不会有任何问题。
只有两种场景需要用string str(s, 3);这种带长度的构造函数:
- 你要复制的字符序列没有空字符结尾(比如某些二进制数据片段)
- 你明确只想复制前N个字符,不管后面有没有空字符
内容的提问来源于stack exchange,提问作者KcFnMi
相关产品推荐
相关产品推荐

