C++构造函数如何初始化其类的对象?

How does a C++ constructor initialize objects of its class?

本文关键字:对象 初始化 构造函数 C++      更新时间:2023-10-16

我从《C++之旅》中读到了这一点,

"与普通函数不同,构造函数保证被使用 初始化其类的对象。因此,定义构造函数消除了类未初始化变量的问题。

此初始化如何工作? 例如,假设我有一个类,其字段"s"类型为string

class C{   
std::string s;   
...
}

"s"是如何初始化的,无论编译器如何,它的值都会被保证为空字符串吗?

这段话的意思是,如果你有一个Initialise()函数,有人可能会忘记调用它。它不能"保证被使用",因为你无法控制人。另一方面,你不能"忘记"调用构造函数,因为你从不调用构造函数:当你实例化对象时,计算机会为你这样做。

当然,这并不意味着构造函数可以保证正确编写;这仍然取决于你。但是,对于像std::string这样的类,很难出错,因为如果您不编写代码来执行其他操作,它至少是默认构造的。

无论您是否有稍后应该调用的Initialise()函数,都会发生这种情况,但是如果您确实在构造函数中放置了一些更复杂的初始化,那么您可以放心,此代码将运行。

// Bad! People can forget to call Initialise, so the string might stay empty
class Foo
{
public:
void Initialise(const bool yesOrNo)
{
m_string = (yesOrNo ? "Yes!" : "No");
}
private:
std::string m_string;
};
// Good! You'll always have a value; no way around that
class Bar
{
public:
Bar(const bool yesOrNo)
: m_string(yesOrNo ? "Yes!" : "No")
{}
private:
std::string m_string;
};

延伸阅读:

  • 维基百科上的"资源获取是初始化">

创建C实例时,std::string s将在所谓的成员初始化中进行初始化。

"s"是如何初始化的,它的值是否保证 空字符串 无论编译器是什么?

你没有向我们展示你是如何创建C的,所以我们不知道使用了什么构造函数。如果使用默认构造函数,则std::string的默认构造函数用于s。这确实会生成一个空字符串,如下所述:

默认构造函数。构造空字符串(零大小和 未指定容量(。