QT6之类实例化——对象指针和对象

这篇具有很好参考价值的文章主要介绍了QT6之类实例化——对象指针和对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Qt完全遵循C++ 中类的实例化动作按存储位置可以分为栈中分配内存堆中分配内存两种,分别对应不用 new 实例化类和用 new 实例化类。

一、实例化两种方式

1、栈中分配;

如下图是qt非常常见的操作,将m_view声明为对象,它完全表明该对象的生命周期与MyWidget的生命周期相关联。

此时m_view是在栈中分配内存的,使用完后你不需要再手动进行内存的释放,类的析构函数会自动执行内存释放的动作。此种方式优势时不需要new也更不需要指针。

//MyWidget.h
class MyWidget : public QWidget {
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
 
private:
    QTreeView m_view;;
};
 
//MyWidget.cpp
MyWidget::MyWidget(QWidget *parent)
  : QWidget(parent)
{
}

2、堆中分配

如下图,使用指向拥有对象的指针,将m_view声明为对象指针。使用 new 进行类的实例化,m_view就是指向类 QTreeView的指针,这个时候内存申请在堆上。

备注:此时其实与C++指针实例化稍微有些区别,你看到只有new却没有delete,传统C++认为堆上用完必须手动使用 delete 释放掉内存,因为 delete 和 new 是一对好伙伴,有 new 的地方就得有 delete,不然会造成内存泄漏。那为什么qt这里没有delete呢?

Qt引入了元对象做内存管理(qt特有),QObject的类及其继承的类,如果设置了parent,当parent被delete时,这个parent的相关所有child都会自动delete,不用用户手动处理,当所有者被删除时,所有从属于它的对象也将被删除。

在QObject的类及其继承的类下,Qt 代码通常仍会使用原始指针,并依赖父/子关系管理所有权,其实是在使用指针来访问对象而不是管理它们的生命周期。它极大的方便了使用指针,在好多人对待指针的看法中“如果可以避免,请不要使用它们”,而qt的这种内存管理方式使好多原则都被忽略了,你new了完全不用delete可以毫无顾虑的去使用。

parent-child 机制:当建立一个控件(widge或者其他控件)时,若此控件伴随着一个 parent,则此 parent 就将此控件加入它的 children list。而当parent 被消除时,会根据 children list 将这些 child 消除掉。若这些 child 也有其 children,也会连同一起被消除。这个机制大大简化了记忆体管理,降低了内存泄漏的风险。因此,唯有那些没有 parent 的控件才使用 delete 消除。

//MyWidget.h
class MyWidget : public QWidget {
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
 
private:
    QTreeView *m_view;;
    
};
 
//MyWidget.cpp
MyWidget::MyWidget(QWidget *parent)
  : QWidget(parent)
{
    // Children parented to `this`
    m_view= new QTreeView(this);   
   
}

二、指向还是不指向?

那么,到底这两张方式有什么区别,哪个更好?

1、使用指针会显着增加内存分配的数量;

2、指针允许用户在MyWidget的标头中转发声明指向的数据类型。这意味着MyWidget的用户不必包含定义QTreeView等的标头。这缩短了编译时间;

3、指针允许你建立“孙子”和更复杂的关系,而不仅仅是直接的孩子。孙子将被其他人(其父母)删除,而不是直接由MyWidget实例删除。如果孙子是MyWidget的子对象,这将意味着通过需要delete销毁一个子对象。

4、指针强制用户正确地为分配的对象设置父级。这在少数情况下会产生影响,例如,如果跨线程移动父对象。当使用完整的对象作为数据成员时,重要的是要记住通过父子关系来建立父/子关系。

所以,一般来说,使用指针似乎利大于弊,这就是为什么它们被使用 Qt 的开发人员广泛采用的原因。文章来源地址https://www.toymoban.com/news/detail-424782.html

到了这里,关于QT6之类实例化——对象指针和对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】二、入门知识讲解 (引用、内联函数、auto、基于范围的for循环、指针空值

    2024年02月04日
    浏览(40)
  • 设计类的时候面向对象遵循的原则 SOLID

    S(single responsibility):单一职责 O(open closed):对扩展开放,对修改关闭(可以扩展,尽量不要修改) L(liskov substitution):里氏替换    任何时候都可以用子类替代父类(父类必须有所有子类的共性) I(interface segregation):接口分离  如果一个类包含了过多的接口方法,

    2024年02月04日
    浏览(52)
  • 【SpringBoot】Spring Boot中类的实例化

    在Spring Boot中,类的实例化通常是由Spring框架处理的。Spring使用控制反转(IoC)和依赖注入(DI)的概念来管理类的实例化和依赖关系。 要在Spring Boot中实例化一个类,可以遵循以下几个步骤: 1. 在类上使用`@Component`、`@Service`、`@Repository`或`@Controller`等注解来标识这个类是一

    2024年02月10日
    浏览(34)
  • 【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象

    2024年02月03日
    浏览(48)
  • 【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针

    🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、类的作用域  二、类的实例化 三、类对象模型  四、this指针 1、this指针的引出  2 this指针的特性 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定

    2024年04月15日
    浏览(46)
  • 面向对象——python中类的创建

    面向对象编程——Object Oriented Programming,简称 OOP ,是一种以对象为中心的程序设计思想。很多高级开发语言都是面向对象的,例如,如雷贯耳的Java、谷歌新推的Kotlin、开发iOS的Objective-C、苹果新推的Swift,以及C++、C#等都是面向对象的。Python也不例外,这篇文章将介绍python中

    2024年02月03日
    浏览(36)
  • 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    🔥 个人主页 : Forcible Bug Maker 🔥 专栏 : C++ 目录 前言 什么是面向对象? 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 最早的C++版本(C with classes)中,最先加上的就是类的机制,它构成了面向对象编程(OOP)的

    2024年04月14日
    浏览(55)
  • Java之类和对象

    C++和Java都是面向对象编程的语言,而C和Go是面向过程编程的语言. 主要概述一下面向对象编程,也就是op.在面向对象的世界中,一切皆对象.解决问题的途径主要是靠对象之间的交互去完成. 类的模板 类就是对一种事物的概述,比如说猫类,狗类,人类等等,在这些类中,有成员变量和成

    2024年02月02日
    浏览(36)
  • 【C++初阶】之类和对象(中)

    📃 博客主页: 小镇敲码人 💞 热门专栏:C++初阶 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么?你问我

    2024年04月13日
    浏览(60)
  • 【C++初阶】之类和对象(下)

    📃 博客主页: 小镇敲码人 💞 热门专栏:C++初阶 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么?你问我

    2024年04月16日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包