Qt|派生类中,其他类的对象如何初始化,其他类包括基类的基类和无关类

来源:互联网 发布:淘宝的化州橘红假吗 编辑:程序博客网 时间:2024/06/14 16:59

       我的RFID程序中,Widget继承自QWidget,在Widget.h中,public定义了数据成员,QTableWidget  *cardtableWidget,在Widget.cpp的Widget构造函数中,初始化了QTableWidget  *cardtableWidget = new QTableWidget(10,3,this);        // 这个定义不是全局定义?


1.C++的派生类不会继承基类的构造函数

2.C++提供了继承含参基类的方法

3.如果派生类中有对象的数据成员,那么构造函数的执行顺序如下。

  (1)基类的构造函数;

  (2)对象成员的构造函数,执行顺序为类定义的说明顺序;

  (3)派生类的构造函数。

4.初始化列表,系统先调用初始化列表来初始化,接着会调用构造函数体内部的代码来初始化,也就是说,后者会覆盖掉前者。

5.在一个对象初始化时,会先调用其基类的构造函数,其成员对象的构造函数,最后是自己的构造函数。

析构的顺序恰好相反。

main.cpp

int main(int argc, char *argv[])  
{
    QApplication a(argc, argv);      //argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名,以后
                                      的参数是命令行后面跟的用户输入的参数,比如在控制台打开notepad并打开一个文本文档
                                      可以在notepad.exe后面跟上文件的路径和名字,如note.pad  example.txt(文件在当前路径)
                                      编译器将输入参数的信息放入main函数的参数列表中。上面的例子就是argv数组中有两个
                                      有效单元。argv数组的第一个单元指向的字符串总是可执行程序的名字,以后的单元指向
                                      的字符串一次是程序调用时的参数。
    Widget w;                        //创建Widget对象
    w.show();                        //显示
    return a.exec();
}
widget.cpp
Widget::Widget(QWidget *parent) : //构造函数定义,在头文件中声明了构造函数public:explicit Widget(QWidget *parent = 0); 
                                                      重定义父对象,看parent参数,当Widget放到某个窗口上的时候,该Widget的父对象
                                                       可以被重定义为该窗口。Widget通过parent指针来告诉父类QWidget:“我要把我的
                                                     父对象设置为该窗口,请通过你的构造函数来实现这个目的”。(为了管理内存而出现,
                                                     如果一个对象的父窗口销毁了,那么这个对象也自动销毁了,释放内存。)
                                                                  
    QWidget(parent),cardtableWidget(new QTableWidget(1,3,this)),   //成员初始化列表
    ui(new Ui::Widget)
{
    ui->setupUi(this);
/*********************表格初始化设置***********************/
//    QTableWidget *cardtableWidget = new QTableWidget(1,3,this);   //新建表格,1行3列
    cardtableWidget->setWindowTitle("充电卡片管理");
    cardtableWidget->resize(500,600);
    QStringList header;
    header<<"卡号"<<"余额(元)"<<"选择状态";
    cardtableWidget->setHorizontalHeaderLabels(header);
    cardtableWidget->setItem(0,0,new QTableWidgetItem("3BB3886E"));
    cardtableWidget->setItem(0,1,new QTableWidgetItem("20.50"));
    QCheckBox *checkbox0 = new QCheckBox();
    cardtableWidget->setCellWidget(0,2,checkbox0);
//    cardtableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);  //任何时候都不能修改表格内容
    cardtableWidget->show();
    createButton();
}

成员初始化列表的两类作用如下:

1@初始化类的数据成员:包括const成员、引用成员、对象成员和普通成员。

2@为基类构造函数传递参数,即初始化继承的数据成员。

总结:

在头文件中定义了非基类的对象成员,在.cpp中调用时,也要new一下,对象具体化;

如果是全局要用的,可以在成员初始化列表中初始化。

原创粉丝点击