类的构造和销毁

额,罪过做过,已经好几天没写博客了,今天多补几篇,嘿嘿。

想了想,其实大部分内容都是看书的总结而已,算不上原创,以后如果没有比较多的自己的代码还是写成装载比较好。

 

这里主要记录一下类的构造,初始化和销毁的过程。

构造

有如下几个特别的地方

  • java延续了c++的方式使用构造器进行构造。
  • 有一个默认构造器,如果自定义了构造器则默认构造器不再存在。
  • 构造器能够重载。
  • 重载之后如果想调用本类的其他构造器可以使用this(param)。如果是想调用父类的构造器可以使用super(param)。这两种调用只能存在一个,并且需要在构造器的第一行。

初始化

默认初始化

当类载入的时候会伴随着内存清零进行成员变量的默认初始化。初始化的值为:

char 是'/0000',int 0 ,float,double是0.0.boolean是false,引用是null。

类被载入系统中之后,就会进行一些初始化。结合类的加载,整体是这样的一个过程:

  • 首先是进行类的加载,把二进制代码和类型信息加载到文本段。先加载父类,后加载子类,加载的同时对static类型的变量进行初始化。初始化顺序按照代码的顺序,并且static类型的变量只初始化一次。
  • 开始构造,同样是从父类开始构造,先进行实例变量的初始化,然后开始执行构造器,如果有显示的this则先执行显示的this调用。
  • 然后构造子类,先进行子类的实例变量的初始化,然后开始执行构造器,如果有显示的this则先执行显示的this调用。
  • 看如下的代码例子:

 

销毁

哈哈,极为简单。就一句话,JVM会为你进行垃圾清理的。只要是没有引用指向的内存空间都是垃圾。

这里需要注意 finalize()方法在java中也不是析构函数,只是一个消亡时会调用的函数,通常我们有两种方式来使用它:

  • 调用其他语言的析构函数。
  • 来查看对象消亡是的某一属性是否是我们想要的状态,可以用来跟踪错误。如下面的代码所示:

 

<think>我们正在讨论Qt的创建、赋值销毁。根据引用内容,我们可以总结如下: 1. 创建:在Qt中,对象的创建通常使用`new`操作符,并且可以通过构造函数指定父对象(如引用[4]所示)。当指定父对象后,对象会被添加到父对象的对象树中,由父对象负责管理其生命周期(引用[3]提到Qt使用对象树管理QObject及其子对象)。 2. 赋值:在C++中,对象的赋值通常通过拷贝赋值运算符(`operator=`)完成。但是,在Qt中,很多(尤其是QObject及其子)禁止拷贝构造拷贝赋值(引用[1]提到“阻止拷贝”“对象移动”相关内容)。因此,对于QObject子,我们通常使用指针进行操作,避免直接拷贝对象。 3. 销毁:Qt中,当父对象被销毁时,它会自动销毁其所有子对象(引用[3])。这是通过Qt的对象树机制实现的。因此,一般情况下,我们不需要手动删除子对象(除非在特定情况下,比如没有父对象的对象,需要手动管理)。 下面我们详细展开: ### Qt对象的创建 在Qt中,创建对象通常使用`new`操作符,并可以指定父对象。例如,创建一个按钮并指定父对象为当前窗口: ```cpp // 在窗口构造函数中 QPushButton *button = new QPushButton("登录", this); // 指定父对象为this(当前窗口) ``` 这样,按钮就会成为窗口的一个子部件,当窗口销毁时,按钮也会自动销毁。 ### Qt对象的赋值 由于QObject及其子禁止拷贝构造拷贝赋值(通过将拷贝构造函数赋值运算符声明为`private`或`=delete`),因此我们不能直接拷贝一个QObject子对象。例如,以下代码是错误的: ```cpp QPushButton button1("按钮1"); QPushButton button2 = button1; // 错误:拷贝构造函数是私有的 ``` 如果需要“赋值”操作,我们通常通过复制对象的状态(属性)来实现,或者使用克隆方法(如果该提供了克隆接口)。另一种方式是使用指针,通过改变指针指向的对象来间接实现“赋值”。 ### Qt对象的销毁 Qt对象的销毁主要通过对象树机制自动完成:当一个父对象被销毁时,它会自动销毁其所有子对象。我们也可以手动删除一个对象(使用`delete`操作符),但前提是该对象没有父对象或者已经从父对象中移除。 例如,手动删除一个按钮对象: ```cpp delete button; ``` 注意:如果该按钮有父对象,通常不需要手动删除,因为父对象销毁时会自动删除它。如果手动删除一个已经被父对象删除的对象(比如在父对象销毁后再次手动删除),会导致程序崩溃。 ### 注意事项 - 对于非QObject的Qt(如QString, QList等),它们是可以拷贝的,并且使用值语义。这些在拷贝时通常采用隐式共享(写时复制)机制,以提高效率。 - 当使用对象树管理对象时,避免循环引用(例如,两个对象互相设置为父对象)会导致内存泄漏。 ### 相关问题 1. Qt中,如何确保对象在正确的时机被销毁? 2. 为什么Qt禁止QObject的拷贝构造拷贝赋值? 3. 在Qt中,如何复制一个QObject子对象的信息? [^1]: C++学习笔记(拷贝、赋值、销毁) [^3]: Qt | 对象树与生命期(对象的创建、销毁、擦查找) [^4]: QT按钮的创建属性设置 </think>### Qt的创建、赋值销毁方法 #### 1. **创建对象** 在Qt中,对象创建通常通过`new`操作符完成,需注意父子对象关系: ```cpp // 示例:创建QPushButton对象 QPushButton* button = new QPushButton("登录", this); // 指定父对象 ``` **关键点**: - 指定父对象(如`this`)时,对象会被纳入**Qt对象树**管理 - 未指定父对象需手动管理生命周期 - 构造函数可同时初始化属性(如按钮文本)[^4] #### 2. **赋值操作** Qt对象赋值需注意: ```cpp // 示例:修改按钮属性(非直接对象赋值) button->setText("退出"); // 通过成员函数修改状态 ``` **限制**: - `QObject`及其子**禁止拷贝构造赋值** - 赋值操作需通过: - 单独修改属性(如`setText()`) - 复制指针而非对象本身 - 使用`QSharedPointer`等智能指针[^1][^3] #### 3. **销毁对象** 销毁机制基于对象树: ```cpp // 父对象销毁时自动销毁子对象 delete parentWidget; // 自动递归销毁所有子对象 ``` **规则**: - 父对象销毁 → 自动销毁所有子对象 - 无父对象需手动`delete` - 析函数自动触发(无需显式调用)[^3][^5] #### 4. **特殊场景处理 - **阻止拷贝**:通过`Q_DISABLE_COPY(ClassName)`宏禁用拷贝 - **移动语义**:C++11后支持移动构造函数(`std::move`) - **静态方法**:`static`方法不依赖对象实例[^2] #### 生命周期示意图 ``` 创建(new) → 操作(setText等) → 销毁(delete) ↑ | 父对象析时自动触发 ``` --- ### 相关问题 1. Qt对象树如何避免内存泄漏?[^3] 2. 为什么Qt禁止`QObject`子的拷贝操作?[^1] 3. 如何在Qt中安全传递对象所有权?[^5] 4. 静态方法(`static`)与非静态方法在Qt中的使用区别?[^2] [^1]: C++学习笔记(拷贝、赋值、销毁) [^2]: QT学习积累——方法加static不加static的区别 [^3]: Qt | 对象树与生命期(对象的创建、销毁、擦查找) [^4]: QT按钮的创建属性设置 [^5]: 【C++ 包裹 std::thread】探索C++11 std::thread
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值