当前位置: 代码迷 >> QT开发 >> QT构造函数的有关问题
  详细解决方案

QT构造函数的有关问题

热度:102   发布时间:2016-04-25 03:43:33.0
QT构造函数的问题。
在QT中,向QTreeWidget添加子项。
QTreeWidgetItem时存在以下疑问

QTreeWidgetItem item(parentitem); 与 
QTreeWidgetItem *item = new QTreeWidgetItem(parentitem);

有什么区别,为什么第一个无法添加到树上,第二个可行?
他们是不是调用的同一个构造函数。
qt?构造函数? QTreeWidgetItem

------解决方案--------------------
第一个item是一个实例,分配在栈上,语句块结束的时候自行销毁,第二个item是一个指针,new把它分配在了堆上,除非你delete它或者它的父对象被销毁,它会一直存在。基本的C++知识
------解决方案--------------------
没错,基本c++
------解决方案--------------------
引用:
在QT中,向QTreeWidget添加子项。
QTreeWidgetItem时存在以下疑问

QTreeWidgetItem item(parentitem); 与 
QTreeWidgetItem *item = new QTreeWidgetItem(parentitem);

有什么区别,为什么第一个无法添加到树上,第二个可行?
他们是不是调用的同一个构造函数。

构造函数是同一个的。
QTreeWidgetItem item(parentitem); 这里的item是个对象,分配在栈上,在离开作用域后会释放掉。按照楼主所述,应该是在你添加的时候,item已经被释放了。
而QTreeWidgetItem *item = new QTreeWidgetItem(parentitem);
这个item是指向QTreeWidgetItem的指针,分配在堆上,在调用delete或者程序结束之前不会被释放。
------解决方案--------------------
其实这个变量的生存空间问题
第一个变量是分配在栈(stack)上,如果出了这个变量的作用域,栈就是自动析构掉这个变量,所以你等于新建后又删除了这个变量
第二个变量利用指针来new的,对象是分配在堆(heap)上的,而且是设置了父对象的,所以其生存周期是和父对象一致地,除非你人为地删除掉,所以你会显示出这个对象
  相关解决方案