【问题标题】:Which string constructor is invoked?调用哪个字符串构造函数?
【发布时间】:2019-06-27 13:43:54
【问题描述】:

我知道这是初始化,但我很困惑在每种情况下都使用字符串文字时调用了 2 个构造函数中的哪一个。它们都是复制构造函数吗?

string::string(const string& strString)
string::string(const char *szCString)

案例1:

string sSource("my string");

案例2:

const char *szSource("my string");

【问题讨论】:

  • 你怎么看,为什么?
  • 你可以在里面放一些打印语句,自己看看。或者用调试器运行它。
  • 只需在调试器中运行即可。然后单步执行代码并亲自查看 - 获取标准副本并阅读规则。
  • 这不是一个“评论”,而是一个相当简单的问题。答案是什么?在获得帮助之前,您必须出示研究和想法的证据。我们不是你的仆人!
  • @softwarelover “它们都是复制构造函数吗?” 复制构造函数需要采用相同(或派生)的类型作为输入。所以问问自己:std::string 是从 const char* 派生的吗?

标签: c++ constructor initialization stdstring string-literals


【解决方案1】:

你可以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::strings!请记住,C++ 作为一门语言, 具有固有的字符串类型; std::string 来自标准库。

那么字符串字面量的类型是什么?这是一个字符数组。 See for yourself(Coliru.com;示例中有获取字符串类型名称的代码)

【讨论】:

  • 感谢您的解释。我希望人们避免发表评论并像您一样回答。
  • 软件爱好者:这不公平。学习如何自己调查这些问题,而不是用勺子喂给你答案,这一点很重要。 @LightnessRacesinOrbit 试图通过让您参与(小型)对话来提供帮助。
  • 这不是真的用勺子喂的。我知道复制构造函数、移动构造函数以及所有这些……只是常规构造函数和复制构造函数让我对字符串感到困惑。我正在考虑将 C 风格的字符串作为 C++ 的一部分..
  • @softwarelover:你不知道的是如何在网站上适当地提问,这意味着 - 展示你如何尝试自己获得答案,或者你为什么会有一个你自己无法解决的困境。
猜你喜欢
  • 2021-09-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
相关资源
最近更新 更多