MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)解析

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    queryTimer(),
    payTimer(),
    httpRequestManager(new QNetworkAccessManager()),
    state(Init),
    tradeNo("")
{
}

最近跟着前輩們打打下手,順便研究研究代碼,以前沒怎麼用過QT和C++語言,這次跟着前輩好好學習。在研究代碼時看到這樣的形式,很怪異,就在網上找了一下,發現有個解釋的就轉載了過來,學習學習,沒想到是初始化。

在mianWindow.cpp中第一行代碼如下。

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
{
}

    這是C++繼承,說明 MainWindow 的構造函數之前需要調用父類 QMainWindow 的帶有參數的構造函數。

    MianWindow是一個類,“::”(作用域區分符)後面跟着的是一個構造函數。但是這個構造函數之後的“:”後面的QMainWindow(parent)該怎樣去理解呢?

    在C++中,A與B之間是繼承關係,A與B之間可以用“:”連接,但是類是沒有參數的。因此QMainWindow(parent)是不能理解爲類的。

    如果不是類,那麼最有可能的就是構造函數。現在假設QMainWindow(parent)爲某類的構造函數,那麼這個構造函數在這句代碼中起到了什麼作用呢?該怎麼去理解這句代碼?這個問題是我第一次碰到這句代碼時在腦袋中產生的疑問(這屬於C++的知識)。

    C++中,通過繼承可以使類形成一種層次關係。在層次關係的根部的稱之爲基類,它負責定義在層次關係中所有類共同的成員;直接或者間接的從基類繼承而來的稱作派生類,它負責定義各自的特有成員。

    在C++中,當創建一個對象時,編譯器要保證調用了所有子對象的構造函數,這是C++強制要求的,也是它的一個機制。

    現在有一個派生類A,它繼承基類B。現在問題是:使用A類創建一個對象後,怎樣初始化它從類B中繼承過來的數據成員?(子類是無法繼承父類的構造函數和析構函數的)。總結下:因爲初始化列表中無法直接初始化基類的數據成員,所以你需要在列表中指定基類的構造函數,如果不指定,編譯器則會調用基類的默認構造函數。

代碼中QMainWindow(parent)是基類構造函數

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)

    構造函數後面括號內的參數表列中只有參數但無參數類型,因爲在這裏不是定義基類構造函數,而是調用基類構造函數,因此這些參數是實參而不是形參。他們可以是常量、全局變量和派生類構造函數總參數表中的參數。 先初始化父類成員變量,從而間接初始化子類從父類繼承過來的成員變量。

    這個問題就是使用上面的那行代碼來解決的。首先QMainWindow是父類(基類)而MainWindow是子類(派生類),他們是繼承關係;MainWindow(QWidget *parent)是類MainWindow的構造函數,QMainwindow(parent)是類QMainwindow的構造函數。類Mainwindow在實現構造函數時,要初始化基類QMainwindow的數據成員但是因爲無法繼承基類的構造函數,所以才用這種方式初始化基類的數據成員。

說一下,這種代碼的具體格式

派生類::派生類構造函數(總參數列表):基類構造函數(參數列表)  //基類構造函數的參數列表是實參。
{
派生類中的數據成員初始化;

} 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章