类字符串是不是总是被初始化为空? [复制]

Posted

技术标签:

【中文标题】类字符串是不是总是被初始化为空? [复制]【英文标题】: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 的替代构造函数吗?我们如何做到这一点,你能给我一些链接吗? 【参考方案1】:

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

【讨论】:

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

以上是关于类字符串是不是总是被初始化为空? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言数组初始化的问题?为啥我初始化了,数组长度还为0啊,如图

整数总是初始化为0吗?

复制字符数组的值并初始化为整数? [复制]

如何将 BigDecimal 格式化为总是有两位小数? [复制]

如何“声明”一个空字节变量?

全局对象内的内置类型的成员变量是不是已初始化为零?