类字符串是不是总是被初始化为空? [复制]
Posted
技术标签:
【中文标题】类字符串是不是总是被初始化为空? [复制]【英文标题】:Does a class string always gets initialized to empty? [duplicate]类字符串是否总是被初始化为空? [复制] 【发布时间】:2021-03-09 14:11:24 【问题描述】:我在课堂上有这个字符串 s
和 t
。
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 s
在main
之前初始化,但在某些情况下可能未初始化,例如在其他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啊,如图