【C++】3.类和对象(中)

一、类的6个默认成员函数

        在上一篇博客中,我们计算了空类的大小为 1 。那么空类中真的什么东西都没有吗?其实不是的,当一个类在什么都不写的时候就会自动生成6个默认的成员函数(用户没有写,但是编译器自动生成的成员函数)。

接下来我们就将围绕上图展开本篇博客……

二、构造函数——用以对象初始化

        构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。

特征:

        1)函数名与类名相同

        2)无返回值(不需要写void)

        3)实例化对象时由编译器自动调用

        4)可以重载(一般建议写一个全缺省的构造)

        5)若类中没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数。

但是,一旦用户显示定义了构造函数,编译器就不会自动生成了

        6)内置类型成员变量在类中声明时可以给默认值

        7)无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。 注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为 是默认构造函数

三、析构函数——用于对象中资源清理

特性:

        1)函数名为在类名前加~

        2)无参无返回值

        3)一个类有且仅有一个析构函数(不支持函数重载),若未显示定义,则由系统自动生成默认的析构函数

        4)对象生命周期结束时,由编译器自动调用析构函数

        5) 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack类。

那么,什么时候需要我们显示定义构造函数,什么时候又不需要我们显示定义析构函数呢?

        需要显示定义情况:有资源需要显示清理时我们需要写析构函数

        不需要显式定义情况:a)没有资源需要清理       

                                            b)内置类型成员没有资源需要清理,剩下的都是自定义类型成员,自定义类型调用自己的析构函数

四、拷贝构造函数——使用同类对象初始化创建对象

        拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存 在的类类型对象创建新对象时由编译器自动调用。

特征:

        1)拷贝构造函数也是构造函数的重载形式

        2)构造函数的参数有且仅有一个,且必须是类类型对象的引用。传值的话编译器会直接报错。因为会引发无限递归

        引发无限递归的原因分析:在传值调用过程中,需要对形参进行拷贝构造,但是并无拷贝构造函数,会引发无限递归,直到程序崩溃

        3)若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。浅拷贝不能对资源进行管理,如栈中的数组就没法浅拷贝,必须深拷贝才能完成

总结:

        1)如果没有管理资源,一般情况下,不需要写拷贝构造,使用编译器默认生成的即可

        2)如果是自定义类型,内置类型成员没有指向资源,默认生成的浅拷贝构造也可以

        3)一般情况下,不需要写析构函数就不需要写拷贝构造函数

        4)如果内部有指针之类的指向资源,需要显示写析构函数,通常也就需要显示写拷贝构造函数完成深拷贝

五、赋值运算符重载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI在运维实践中的价值提升

在2024年的AI赛道上,利用大数据 、机器学习算法、人工智能来改善运维效率已成为软件运营商发展的新主张,通过AI在运维流程的洞察、决策和执行,从而提升效率、减少故障时间,优化用户体验。通过分析大量数据来识别趋势和模式&#x…

C ++ 和 C语言的优缺点分别是什么?

C语言,它简直就是编程世界的一块磐石。简洁、直接,让人一眼就能明白它想干嘛。它的运行速度快,接近硬件操作,特别适合那些需要直接与硬件打交道的场景。但就是因为这种接近硬件的特性,C语言在抽象层次上就显得有点捉襟…

科技感画册制作方法,视觉效果直接拉满

随着科技的不断进步,科技感画册制作也变得更加精彩和引人注目。通过巧妙地运用先进的设计工具和技术,以及结合创新的视觉元素,可以轻松地将画册的视觉效果直接拉满。 那你想知道怎么制作吗?现在我来教你这个方法吧,方法…

第九届少儿模特明星盛典 全球赛首席体验官『彭禹锦』精彩回顾

2024年1月30日-2月1日,魔都上海迎来了龙年第一场“少儿形体行业美育春晚”!由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官!近2000名少儿模特选手从五湖四海而来,决战寒假这场高水准,高人气&#xff…

docker安装并跑通跑通QQ机器人实践(1)-前言及展示

随着大模型技术的迅猛发展,行业应用日益丰富且专业化。为了有效利用大模型的强大功能,建立与之紧密互动的应用接口至关重要。在此背景下,QQ、微信、钉钉等主流即时通讯工具凭借其广泛的用户覆盖和便捷的通信特性,成为连接用户与大…

CompletableFuture 处理异步异常

1、自定义线程池 Configuration public class ThreadPoolConfig {public static ThreadPoolExecutor getThreadPoolExecutor() {int availableProcessors Runtime.getRuntime().availableProcessors();return new ThreadPoolExecutor(availableProcessors,availableProcessor…

深入探索:Zookeeper+消息队列(kafka)集群

目录 前言 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper 特点 3、Zookeeper工作机制 4、Zookeeper 选举机制 4.1 第一次启动选举机制 4.2 非第一次启动选举机制 5、Zookeeper 数据结构 6、Zookeeper 应用场景 二、部署 Zookeeper 集群 1、环境部署 2、安装 z…

Linux进阶篇:linux操作系统一个神奇的分区:swap交换分区

linux操作系统一个神奇的分区:swap交换分区 1 Swap交换分区概念 Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就…

macOS 待机一段时间后所有打开的应用会被退出

最近在使用MacBook电脑时,发现电脑在待机一段时间再登录进去时,发现所有打开的应用都被退出了,就跟刚开机一样,很影响使用体验,查找资料时发现有个设置被打开了,只需关闭这个设置就可以解决该问题&#xff…

数据结构--选择排序

1、选择排序 1.1 基本认识 1.1.1 基本概念 选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n) 的时间复杂度。 1.1.2 算法步骤 (1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起…

Java并发--内存结构图及线程安全

内存结构图 内存-> (开辟的数组) -> (方法区,堆,栈,程序计数器,本地方法栈) 堆:几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。 方法区它用于存储已被虚拟机加载的类型信息…

实现iOS App代码混淆

简介 在开发iOS应用程序时,保护代码安全是至关重要的。代码混淆是一种常用的技术,可以增加逆向工程的难度,防止他人对代码的篡改和盗用。本文将介绍如何实现iOS App代码混淆的步骤和操作方法。 整体流程 下面是实现iOS App代码混淆的整体流…

Python输入与输出

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合集 私信未回可以加V:hacker0327 备注零基础学Python 订阅专…

浏览器渲染原理-解释回流重绘以及为什么transform效率高

浏览器是如何渲染页面 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启染流程。 整个渲染流程分为多个阶段&#xf…

HW面试经验分享 | 某服蓝队初级

前言 依稀记得是22年 7、8月份参加的HW,当时是比较炎热的时候,但又夹杂一丝秋意。也是头一次去离家乡比较远的地方,多少有点忐忑……(怕被噶腰子、水土不服、吃穿用住没着落等等),但最终也是平安无事且顺利…

笔记84:关于递归法的一些感悟

题目1:二叉树的前序遍历 链接:. - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…

独立服务器如何安装Webmin面板

本周有一个客户,购买Hostease的独立服务器,询问我们的在线客服,独立服务器支持安装Webmin及如何安装的问题。我们为用户提供教程,用户很快完成了设置。在此,我们分享这个操作教程,希望可以对您有帮助。 Web…

SkyWalking 为所有的API接口增加 tag

背景胡扯 线上接口报错,接着被 SkyWalking 抓到,然后 SkyWalking 触发告警,最后老板你,让你辛苦一下,在明早上班前把这个bug 改了,并告诉你你是全公司的希望。谁说不是呢?为公司业务保驾护航&a…

成都欣丰洪泰文化传媒有限公司领航电商新纪元

在当今数字化飞速发展的时代,电商行业异军突起,成为推动经济增长的重要力量。在这股浪潮中,成都欣丰洪泰文化传媒有限公司以其专业的电商服务脱颖而出,成为业界的佼佼者。本文将带您一探这家公司的独特魅力和专业服务,…

D365开发-在视图按钮的js里,引用别的js里的公共方法

公共方法写法: "use strict"; var JJMC window.JJMC || {}; JJMC.SamMCommon JJMC.SamMCommon || {}; (function () { this.cloneRecord function (excludeAttrbuteNames){ / } }).call(JJMC.SamMCommon); 然后在需要调方法的command里面,之…