C++构造函数如何初始化其类的对象?
How does a C++ constructor initialize objects of its class?
我从《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
。这确实会生成一个空字符串,如下所述:
默认构造函数。构造空字符串(零大小和 未指定容量(。
相关文章:
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 对象初始化中是否允许指向此成员的指针?
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么两种不同的对象初始化方式给出不同的输出
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- afxmem.cpp中的对象初始化差异
- 删除通过取消引用新对象初始化的对象
- 如何使用sregex_token_iterator对象初始化向量
- 关于默认构造函数,对象初始化/使用C++ OOP
- C++ 基元类型初始化与对象初始化
- 哪个函数负责C++全局范围内的类对象初始化?
- C++中构造函数的对象初始化出现问题
- 如何修复模板 BST 类的对象初始化
- 无法在 QML/C++ 中使用绑定对象初始化 UI
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- 类对象初始化的二维向量
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 对象初始化
- 类对象初始化
- 使用从另一个类继承的类的对象初始化成员对象