首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::string s1 {“现代C++",3} vs std::string s1 {str,3}

std::string s1 {“现代C++",3} vs std::string s1 {str,3}
EN

Stack Overflow用户
提问于 2021-01-01 22:35:30
回答 4查看 2.7K关注 0票数 69

以下代码的输出使我感到困惑:

代码语言:javascript
复制
const std::string str = "Modern C++";

std::string s1 {"Modern C++", 3};
std::string s2 {str, 3};

std::cout << "S1: " << s1 << "\n";
std::cout << "S2: " << s2 << "\n";

产出:

代码语言:javascript
复制
> S1: Mod
> S2: ern C++

有人能解释这个结果吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-01-01 22:43:38

发自:

字符串

代码语言:javascript
复制
std::string s1 {"Modern C++", 3};

使用下列构造函数:

代码语言:javascript
复制
basic_string( const CharT* s,
          size_type count,
          const Allocator& alloc = Allocator() );

所以需要3个字符才能得到Mod

代码语言:javascript
复制
std::string s2 {str, 3};

将使用以下构造函数:

代码语言:javascript
复制
basic_string( const basic_string& other,
          size_type pos,
          const Allocator& alloc = Allocator() );

所以从位置3开始取字符串,给出:ern C++

票数 66
EN

Stack Overflow用户

发布于 2021-01-01 22:44:00

一个叫string(char const*, count),另一个叫string(string const&, pos)

一个从缓冲区中获取前3个字符,另一个在第三个之后获取所有字符。

这是因为C++有原始字符缓冲区和std字符串。"this is not a std::string""this is a std string"sstd::string so_is="this";.

std::string已经有30多年的历史了,它被添加到C++语言中时没有足够的注意(与STL不同,它在添加之前经历了更多的迭代)。

它的界面实在太丰富了,您可能会遇到这样的情况:多个重载会导致令人困惑的结果。

票数 35
EN

Stack Overflow用户

发布于 2021-01-02 22:14:21

有人能解释一下为什么吗?

这是因为std::string有它不应该使用的构造函数(@ORR 解释 the details)。它不应该有这些构造函数,因为:

  1. 使用命名构造器成语 / std::string方法和现有的构造函数可以轻松地实现它们的效果--不需要额外的成本(至少在C++11中),以及
  2. 仅仅通过查看构造函数调用就可以理解构造函数参数是如何使用的,这并不是显而易见和琐碎的。

这并不是标准库中仅有的具有这种可扩展(IMHO)构造函数的情况;std::vector构造函数种类过多和混淆/误导性构造函数语义而闻名。

生活课程:

  • 简化构造函数;不是每一组用于构造类对象的常用值都有自己的构造函数;
  • 相反,使用命名构造器成语
  • 让您的代码审阅者或其他一些不带偏见的人阅读对您的构造函数的调用,以判断每个构造函数的含义是否足够明显。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65534293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档