2016-01-09 151 views
0

更新:感謝您的快速回復和對重複的抱歉 - 我不知道該搜索什麼,因爲我不知道該建築是什麼。這個構造函數在做什麼?

我只使用非常非常簡單的C++類(與Arduino一起工作),所以如果這個問題太過簡單,請原諒我。

我想了解下面的代碼片段,它是從Qt BLE example。我以前沒有見過這樣的構造函數。有人能告訴我它叫什麼(樣式等等,所以我可以查看它),和/或它在做什麼?

顯然,這是初始化某些情況下,有些變量,但我不明白爲什麼......(他們不是parameters,所以它們是什麼?)「初始化」是花括號外面。

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

回答

1

這就是所謂的一個成員初始化列表。對於不能被默認初始化的成員和基地來說是必要的。但是,正如這裏,它也是一個方便的符號。

請注意,列表中的順序不會影響實際的初始化順序。

無論成員初始化列表中的順序如何,初始化的成員都按聲明順序初始化。如果這些訂單有所不同,您可能會收到警告。鼬語言的原因:如果用於初始化對象的構造函數沒有明確地初始化一些普通的舊數據成員(例如int成員),並且該成員沒有用默認初始化程序聲明,那麼該成員剛剛未初始化,不確定值

然而,對相關細節的全面討論將會太長而無法放在這裏。

你需要一個很好的C++教科書,爲此你可以看看SO C++ Book List

+0

該命令不會影響初始化順序,但有些編譯rs(例如gcc),當啓用完整警告時,會發出警告「亂序」初始化 – madduci

1

member initializer list

成員初始化列表指定了直接和虛擬基礎子對象和非靜態數據成員的初始值設定。

在構成構造函數體的複合語句開始執行之前,完成所有直接基礎,虛擬基礎和非靜態數據成員的初始化。成員初始化列表是可以指定這些對象的非默認初始化的地方。對於不能被默認初始化的成員,例如引用成員和常量限定類型,必須指定成員初始值設定項。對於沒有成員初始值設定項的匿名聯合或變體成員,不執行初始化。

成員初始化的在列表中的順序是無關緊要的:初始化的實際順序如下:

1)如果構造爲最派生類,虛基 類的順序初始化它們出現在基類聲明 的 深度優先左到右遍歷(左到右是指在鹼說明符列表的外觀)

2)然後,直接基類被初始化按照從左到右的順序排列 ,因爲它們出現在這個類的基地說明符列表中

3)然後,非靜態數據成員按類定義中的 聲明的順序進行初始化。

4)最後,構造體被執行

2

它初始化在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類的成員

相關問題