gpt4 book ai didi

c++ - c++中字符串的这两种不同的初始化有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:51 24 4
gpt4 key购买 nike

源代码

#include <iostream>
#include <string>
using namespace std;
int main(){
std::string s{'a', 'b', '\0', 'c'};
std::string s1="ab\0c";
cout<<s.size()<<" "<<s<<endl;
cout<<s1.size()<<" "<<s1<<endl;
return 0;
}

输出是

4 abc
2 ab

我想知道为什么会出现这种现象,这两种初始化在C++中有什么区别吗?谢谢。

最佳答案

对于 s,您正在匹配接受字符初始化列表的构造函数:列表中的 (9) here . string 类允许您从任意数据构造字符串,其中可能包含嵌入的 NUL,正如本例中所做的那样。初始化列表知道自己的长度,因此 string 捕获所有字符。

对于s1,匹配的构造函数是上面链表中的(5),它接受一个const char*——编译器让提供的char数组衰减在调用该构造函数之前指向这样的指针,这意味着构造函数不知道数组的长度。相反,它假设您故意使用 ASCIIZ NUL 终止字符串约定(如在“C”字符串中),并扫描数据以找到第一个 NUL,考虑到终止符。因此,字符串中只捕获了 2 个字符。

请注意,您可以使用...明确捕获 4 个字符

std::string s1 { "ab\0c", 4};

...与列表中的构造函数 (4) 匹配。

Rakete1111 下面的评论说明了另一种创建此类字符串的更新方法:auto s1 = "ab\0c"s;

关于c++ - c++中字符串的这两种不同的初始化有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42582584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com