| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> (黑马C++)L03 对象的构造和析构 -> 正文阅读 |
|
[C++知识库](黑马C++)L03 对象的构造和析构 |
对象的初始化和清理构造函数和析构函数会被编译器自动调用,完成对象初始化和对象清理工作。即使自己不提供初始化操作和清理操作,编译器也会增加默认的操作,所以编写类就应该顺便提供初始化函数。 构造函数和析构函数必须写在public下才可以调用到。 1)构造函数和析构函数的概念 构造函数主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用;析构函数主要用于对象销毁前系统自动调用,执行一些清理工作。 2)构造函数和析构函数的语法 构造函数与类名相同,没有返回值,不写void,可以发生重载(可以有参数),由编译器自动调用而不是手动,而且只会调用一次。 析构函数与类名相同,但类名前面需要加"~",没有返回值,不写void,不可以有参数(不能发生重载)。
3)构造函数的分类及调用 构造函数按照参数进行分类,分为无参构造函数(默认构造函数)和有参构造函数;
按照类型进行分类,可分为普通构造函数和拷贝构造函数。
构造函数的调用方式分为括号法调用、显示法调用以及隐式类型转换。 使用括号法调用时,默认构造函数不要加(),加括号编译器会认为是函数声明; Person(100)叫做匿名对象,匿名对象特定,如果编译器发现对象是匿名的,那么在这行代码结束就释放这个对象; 不能用拷贝构造函数初始化匿名对象,如果写成Person(p5)编译器会认为写的是Person p5,按照对象的声明处理,写成右值才会按拷贝构造进行处理。
4)拷贝构造函数调用时机 1.用已经创建好的对象来初始化新的对象
2.以值传递的方式给函数参数传值
3.以值的方式返回局部对象
5)构造函数的调用规则 系统默认会给一个类提供三个函数:默认构造,拷贝构造,析构函数。 1.当提供了有参构造函数,系统就不会再提供默认构造函数,但是系统还会提供默认的拷贝构造函数; 2.当提供了拷贝构造,系统就不会提供其他构造了。 6)深拷贝和浅拷贝 有参构造函数就是为了初始化属性。
当上述代码加上拷贝函数后,无法运行成功,因为当p1调用析构函数之后指针指向的地址里的内容已经被释放,当p2再调用析构时,m_Name也不为空,进行释地址内容时会发生异常。
上述拷贝方式叫做浅拷贝,浅拷贝直接将p1的地址拷贝给p2,导致析构时释放堆区空间两次发生异常,解决方法是使用深拷贝。深拷贝不会直接拷贝地址,而是开辟一块新的空间,此时都调用析构函数时不会再发生错误。
7)初始化列表 数据的初始化可以使用有参构造函数以及初始化列表。 利用构造函数初始化数据:
?利用初始化列表初始化数据:构造函数后面 + : 属性(参数),属性(参数)...
8)类对象作为类成员的实例
类对象作为类成员的时候,构造顺序先将类对象一一构造,然后构造自己,析构的顺序相反。 9)explicit关键字作用 使用了explicit关键字就不能用隐式类型转换来构造对象,explicit用来防止隐式类型转换。 10)动态对象创建 C语言提供了动态内存分配函数malloc和free,用于从堆中分配和释放存储单元,然而这些函数在C++中不能很好的运行,因为它不能很好完成对象的初始化工作。 1.使用malloc存在的问题: 程序员必须确定对象的长度;malloc返回一个void*指针,C++不允许将void*赋值给其他指针,必须强制类型转换;malloc可能申请内存失败,所以必须判断返回值确保内存分配成功;用户在使用对象之前必须对他初始化,构造函数不能显示调用初始化,用户可能会忘记调用。 2.可以使用new来开辟空间,new的对象会默认调用构造函数,使用方法如下:
3.new和malloc的区别: new在堆区开辟空间,所有new出来的对象都会返回该类型的指针; malloc不会调用构造,new会调用构造; new是一个运算符,malloc是一个函数。 释放堆区的空间用delete,delete也是一个运算符,要配合new使用;malloc配合free使用。
void*接收new的对象会造成无法释放,所以要避免这种写法。 4.通过new开辟数组
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 11:12:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |