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


1、https://blog.csdn.net/weixin_41157654/article/details/80820520

最近跟着前輩們打打下手,順便研究研究代碼,以前沒怎么用過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的數據成員但是因為無法繼承基類的構造函數,所以才用這種方式初始化基類的數據成員。

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

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

2、https://bbs.csdn.net/topics/380091458

Dialog::Dialog(QWidget *parent):QDialog(parent)中的QDialog(parent)是什么意思?

parent參數指定了Dialog的父窗口部件,如果是0,意味着該Dialog沒有父對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM