这个构造函数在做什么?

时间:2016-01-09 11:57:21

标签: c++ qt

更新:感谢您快速回复并抱歉复制 - 我不知道该搜索什么,因为我不知道该建筑的名称是什么。

我只使用非常非常简单的C ++类(使用Arduino),请原谅我这个问题是否过于基本。

我正在尝试了解下面的代码段,该代码段来自Qt BLE example。我之前没见过像这样的构造函数。有人可以告诉我它叫什么(风格等等,所以我可以查一查),和/或它在做什么?

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

pingpong.cpp
pingpong.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()));
}

3 个答案:

答案 0 :(得分:2)

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

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

假设:

class PingPong
{
  public:
    PingPong();

  private:
    int32_t m_serverInfo{0};
    std::string m_aString{"I am a string"};
};

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

答案 1 :(得分:1)

这称为成员初始化列表。对于无法默认初始化的成员和基础是必要的。但是,这也是一个方便的符号。

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

初始化的成员按声明顺序初始化,而不管成员初始化列表中的顺序如何。但是,如果这些订单不同,您可能会收到警告。 weasel语言的原因:如果用于初始化对象的构造函数未显式初始化某些普通旧数据成员(例如int成员),并且该成员不是使用默认初始化程序声明,然后该成员保持未初始化状态,不确定值

然而,对相关细节的全面讨论将无法在此处进行。

你需要一本优秀的C ++教科书,为此你可以查看SO C++ Book List

答案 2 :(得分:1)

它是member initializer list

  

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

     

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

     

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

     

1)如果构造函数是针对派生程度最高的类的虚拟基础   类按它们出现的顺序初始化   基类深度优先从左到右遍历基类声明   (从左到右指的是基本说明符列表中的外观)

     

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

     

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

     

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