【问题标题】:Does a class string always gets initialized to empty? [duplicate]类字符串是否总是被初始化为空? [复制]
【发布时间】:2021-03-09 14:11:24
【问题描述】:

我在课堂上有这个字符串 st

class A
{
    private:
    static string s;
    string t;
    public:
    void printString()
    {
        cout<<s<<t<<endl;
    }
};

我尝试打印这些字符串,如果没有初始化,每次它们都是空的。所以我的问题是在构造函数初始化之前类字符串是否总是空的。静态和非静态字符串也是如此吗?

【问题讨论】:

  • 这取决于“在被构造函数初始化之前”的意思。您的意思是“在被std::string 构造函数初始化之前”还是“在被A 的构造函数初始化之前”。
  • 是的,我的意思是 A 的构造函数,这是否意味着 std::string s 总是初始化为空?
  • 除非您指定使用替代构造函数,是的,默认构造函数会将std::string 初始化为空。 See implementation (1) here.
  • @pujadeo smain 之前初始化,但在某些情况下可能未初始化,例如在其他static 成员从其他.cpp 文件初始化期间。 s 的初始化方式取决于它在源文件中的定义方式。在.cpp 文件中应该有一个std::string A::s; 语句或等效语句来确定它的构造方式。
  • specify using an alternate constructor 你的意思是std::string 的替代构造函数吗?我们如何做到这一点,你能给我一些链接吗?

标签: c++ string initialization private access-modifiers


【解决方案1】:

在这两种情况下,都会调用默认的字符串构造函数。 std::string 类的默认构造函数将始终将其初始化为空字符串。

【讨论】:

  • 询问“在构造函数初始化之前”的部分可能会使此答案无效,具体取决于其含义。您可以在调用s 的构造函数之前调用printString()
  • @FrançoisAndrieux 那不是 UB 吗?
  • @cigien 是的,但它与s 肯定永远为空的暗示相矛盾。它可能是不确定的。
  • @FrançoisAndrieux 是的。我想答案可以澄清这一点,但我认为这部分不是太必要。
  • @Equinox 一个例子是,如果来自另一个源文件的 static 成员或全局对象的构造函数最终调用 A::printString()。对象s 可能尚未构建,也可能尚未构建。
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2021-08-26
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多