我的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一下,对象具体化;
如果是全局要用的,可以在成员初始化列表中初始化。