这个构造函数在做什么

What is this constructor doing?

本文关键字:什么 构造函数      更新时间:2023-10-16

更新:感谢您的快速回复,并对重复的内容表示抱歉——我不知道该搜索什么,因为我不知道这个构造叫什么。

我只使用过非常非常简单的C++类(在使用Arduino时),所以如果这个问题太基本,请原谅

我试图理解下面的代码片段,它来自一个Qt BLE示例。我以前从未见过这样的构造函数。有人能告诉我它叫什么吗(风格等,这样我就可以查了),和/或它在做什么吗?

很明显,它正在初始化一些实例和变量,但我不明白为什么。。。(它们不是parameters,那它们是什么?)"initializers"在大括号之外。

乒乓球.cpp
乒乓球.h


PingPong::PingPong():
    m_serverInfo(0), socket(0), discoveryAgent(0), interval(5), m_resultLeft(0), m_resultRight(0),
    m_showDialog(false), m_role(0), m_proportionX(0), m_proportionY(0), m_serviceFound(false)
{
    m_timer = new QTimer(this);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(update()));
}

这是一种在C++中初始化类成员的方法,称为成员初始化器列表

另一种方法(主要是C++11/14/17)可以直接在头文件/类声明中初始化成员

假设:

class PingPong
{
  public:
    PingPong();
  private:
    int32_t m_serverInfo{0};
    std::string m_aString{"I am a string"};
};

计时器和connect()用于初始化QTimer,并连接计时器发出的信号timeout(),并将该事件连接到另一个名为update()的函数和PingPong类的成员

这被称为成员初始化列表。对于不能默认初始化的成员和基,这是必需的。但它也是,就像这里一样,只是一个方便的符号。

请注意,列表中的顺序不会影响实际的初始化顺序。

无论成员初始化列表中的顺序如何,初始化的成员都按声明顺序进行初始化。然而,如果这些订单不同,您可能会收到警告。黄鼠狼语言的原因:如果用于初始化对象的构造函数没有显式初始化某些纯旧数据成员(例如int成员),并且该成员没有用默认初始化器声明,那么该成员就没有初始化,具有不定值

然而,对相关细节的全面讨论时间太长,无法在此进行。

你需要一本好的C++教材,为此你可以查阅SO C++图书列表。

它的成员初始值设定项列表:

成员初始值设定项列表指定直接和虚拟基子对象以及非静态数据成员的初始值设定值。

在构成构造函数函数体的复合语句开始执行之前,所有直接基、虚拟基和非静态数据成员的初始化都已完成。成员初始值设定项列表是可以指定这些对象的非默认初始化的位置。对于无法默认初始化的成员,例如引用和常量限定类型的成员,必须指定成员初始值设定项。不为没有成员初始值设定项的匿名联合或变体成员执行初始化。

列表中成员初始化程序的顺序无关紧要:实际初始化顺序如下:

1) 如果构造函数用于派生最多的类,则为虚拟基类类按照它们在中出现的顺序进行初始化基类声明的深度优先从左到右遍历(从左到右指出现在基本说明符列表中)

2) 然后,按从左到右的顺序初始化直接基类因为它们出现在这个类的基本说明符列表中

3) 然后,按以下顺序初始化非静态数据成员类定义中的声明。

4) 最后,构造函数的主体被执行