C++程序设计——类的六个成员函数

news2024/12/24 9:08:15

类的六个成员函数

 空类中真的什么都没有吗?

        事实上任何一个类,在我们不写的情况下,都会自动生成6个默认的成员函数。

1.构造函数

概念:

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

构造函数的主要作用是初始化对象,不是开辟空间创建对象

特征:

1.函数名与类名相同

2.创建对象时,由编译器自动调用,用户无法调用

3.无返回值(void也不可以)

4.构造函数可以重载

5.若类中没有显式定义构造函数,则编译器会自动生成一个无参的默认构造函数;若用户已显式定义,则编译器不再生成

6.无参和全缺省的构造函数都称为默认构造函数,且默认构造函数只能有一个

例1:

 

例2:

例3:

 

2.析构函数

概念:

        与构造函数相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的,而对象在销毁时,会自动调用析构函数,完成类的一些资源清理工作。

特性:

1.析构函数名是在类名前加上一个字符‘~’。

2.没有参数(可以加void,但一般不会这样使用),没有返回值。

3.一个类有且仅有一个析构函数(不能重载)。若未显式定义,系统则会自动生成默认的析构函数。

4.对象生命周期结束时,C++编译系统会自动调用析构函数。

默认的成员函数,一定会生成?

        从语法上来讲,是一定会生成的,但是实际情况中并不一定。因为语法是靠人来具体实现的,有时需要考虑一些其他因素,比如程序的运行效率,所以有可能不会严格按照语法来实现。

        比如一下代码,并没有什么意义,在某些编译器及版本中(例:VS2013),就不会生成类的默认成员函数。

3.拷贝构造函数

概念:

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

特征:

1.拷贝构造函数是构造函数的一个重载形式

2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用

3.若未显式定义,系统会生成默认的拷贝构造函数。

注意:默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝属于浅拷贝,或叫值拷贝;所以没有涉及到资源管理,可以直接使用默认的拷贝构造函数。

为什么拷贝构造函数使用传值方式会引发无穷递归?

        那我们就假设可以使用传值方式,那么在调用拷贝构造函数时就会发生临时拷贝,需要将实参拷贝到形参中,即通过实参来构造形参对象,那么此时就又需要调用拷贝构造函数,因此陷入无穷递归调用。

什么情况需要自实现拷贝构造函数?

        因为默认的拷贝构造函数采用的是浅拷贝,因此当涉及到资源的管理时,就需要自实现拷贝构造函数。

调用拷贝构造函数的场景

(1)用一个对象直接构造一个新对象

(2)类类型对象,以值的形式传参

(3)类类型对象,以值的方式作为函数返回值

注意:若直接创建返回一个匿名对象,编译器不会通过拷贝构造函数创建一个临时对象返回,而是直接将匿名对象返回。

4.赋值运算符重载

概念:

        C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型、函数名,以及参数列表,其返回值类型与参数列表和普通的函数类似。

函数名:关键字operator后面接需要重载的运算符符号

函数原型:返回值类型  operator操作符(参数列表)

注意:

1.不能通过连接其他符号来创建新的操作符,比如operator@

2.重载操作符必须有一个类类型或者枚举类型的操作数

3.用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义

4.作为类成员的重载函数时,其形参看起来比操作数数目少一,其实成员函数的操作符有一个默认的形参this,限定为第一个参数

5.以下五个运算符不能重载:.*、::、sizeof、?:、.

什么情况需要自实现赋值运算符重载?

        默认的赋值运算符重载,也是采用的浅拷贝,所以如果类中未涉及到资源管理时,赋值操作是否显示提供都可以,需要则提供,不需要则可不提供,利用编译器完成赋值操作即可。

        若类中涉及到资源管理,则用户必须显示实现,否则编译器默认生成的赋值运算符重载实现采用的是浅拷贝,可能造成资源、内存泄漏,和多个对象共享同一份资源,在销毁时造成代码崩溃。

为什么赋值运算符重载必须重载为类的成员函数?

        因为赋值运算符重载是类默认的成员函数,若用户没有显示定义时,编译器会自动生成一份,而此时若用户自己再在类外实现一份,相等于存在两个赋值运算符重载形成歧义,编译器则会报错。

较为标准的赋值运算符重载

(1)加返回值,支持连续赋值

        类类型对象赋值,相当于是调用赋值运算符重载函数,结合连续赋值的本质,所以需要对赋值运算符重载函数加返回值。

(2)返回引用(前提不影响功能实现),提高效率

        返回引用,则返回时不需要再调用拷贝构造函数构造临时对象,提高程序效率。

(3)引用传参,提高效率

(4)const修饰参数,防止参数对象被修改

(5)添加检验,防止本身给本身赋值

实现重载前置++与后置++

        因为++运算符是单目运算符,作为类的成员重载函数,自带了默认的形参this,所以为了能够实现前置与后置++重载,可以选择在其中一个重载函数中,多加一个形参作为区分

注意:

        后置++是先使用,再+1。所以需要先临时保存对象,再对对象数据+1,然后返回的是+1前的临时对象(即这里不可以返回引用)。

5.const成员函数

const修饰类的成员函数:

        将const修饰的类成员函数称之为const成员函数;const修饰类成员函数,(本质)实际上修饰该成员函数隐藏的this指针,表明在该成员函数中不能对类的任何成员进行修改

例:

        比如以下函数,本意只是想对时间进行一个打印输出,但是在内部可能不小心会对数据造成修改,影响功能实现:

this的类型:Time* const this

即this指针的指向不能修改,但是this指向对象中的内容可以修改。

        此时就可以通过const修饰该成员函数,表明在该成员函数中不能对类的任何成员进行修改。

this的类型:const Time* const this

即this指针的指向不能修改,指向对象中的内容也不能修改。

相关问题

(1)const对象能否调用非const成员函数?

        不能,const类型对象只能调用const成员函数,不能调用普通成员函数。因为普通成员函数可能会对对象中的成员进行修改。

(2)非const对象能否调用const成员函数?

        可以,普通对象对于普通成员函数和const成员函数都可以调用。

(3)const成员函数内,能否调用其他的非const成员函数?

        不能,同理非const成员函数可能会对对象的成员进行修改,而const成员函数内不能对对象的任何成员进行修改。

(4)非const成员函数内,能否调用其他的const成员函数?

        可以。

注意:

        构造函数,拷贝构造函数,析构函数,赋值运算符重载,不可以使用const修饰。因为以上四个函数目的就是对成员进行修改。

mutable关键字

        mutable关键字修饰成员变量,表示该成员变量可以在const修饰中被修改。

6.取地址及const取地址操作符重载

取地址操作符重载:

 

const取地址操作符重载:

注意:

        这两个运算符一般使用编译器生成的默认取地址重载成员函数即可,一般不需要自己实现重载。只有特殊情况才需要自己实现,比如想要让别人获取指定的内容等。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基于机械臂触觉伺服的物体操控研究】几种轨迹规划的算法及代码实现

我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》,这个系列主要用于记录做毕设的过程。 轨迹规划是机器人绕不过去的话题,其目的是为了让机器人的运动更加的平滑。对于四足机器人,贝赛尔曲线的应用比较普遍。而对于机械臂,…

【C++】C++ 入门(一)

目录 一、前言 1、什么是C 2、C关键字(C98) 二、第一个C程序 三、命名空间 1、存在意义 2、命名空间定义 3、命名空间的使用 3.1、指定命名空间访问 3.2、全局展开访问 3.3、部分展开访问 四、C输入&输出 五、缺省参数 1、缺省参数概念 2、缺省参数分类 2.…

【Day4】24两两交换链表中的节点、19删除链表的倒数第N个节点、链表相交、142环形链表Ⅱ

【Day4】24两两交换链表中的节点、19删除链表的倒数第N个节点、160链表相交、142环形链表Ⅱ24.两两交换链表的点19.删除链表的倒数第N个节点160链表相交 面试题02.07142 环形链表Ⅱ判断链表是否有环若链表有环,如何找到环的入口24.两两交换链表的点 题目链接&#…

Spacedesk 安装教程及连接后黑屏解放方法

spacedesk 安装教程1. Spacedesk 概述2. Spacedesk 安装教程2.1 下载 Spacedesk2.2 连接计算机的 Spacedesk3. 被拓展的设备连接后黑屏的解决方法结束语1. Spacedesk 概述 Spacedesk 是一款低延迟的免费显示器拓展软件,且不需要线材将不同设备连接; Spa…

MySQL中的普通索引和唯一索引实际开发中的选择

文章目录前言一、普通索引和唯一索引介绍二、查询语句的比较三、更新语句的比较四、索引的选择和实践前言 本文我们将会从针对普通索引与唯一索引的增删改查的具体执行流程,来看看效率的对比。以便让我们在实际业务开发中可以进行更好的选择。 一、普通索引和唯一索…

动态规划系列 —— 背包问题

什么是背包问题 背包问题是有N件物品,容量为V的背包 每个物品有两个属性:体积,价值,分别用数组v,w表示 第i件物品的体积为v[i],价值为w[i] 计算在背包装得下的情况下,能装的最大价值是多少&…

MATLAB 图像处理大作业

1、基础知识利用 MATLAB 提供的 Image file/IO 函数完成以下处理:(a)以测试图像中心为圆心,图像长宽中较小值一半为半径画一个红颜色的圆;(b)将测试图像涂成国际象棋状的‘黑白格’样子&#xf…

华芯片特微 M33内核 KEIL5环境配置不上问题

1 JFLASH连接不上问题 官方手册有说解决这个问题 2 JFLASH能连接上KEIL提示no found sw-dp 在替换keil下载算法后还是提示no found sw-dp 1 怀疑是keil 527版本太高了, 就换了518 还是不行 2 怀疑是keil检测到盗版了就不让下, 替换Jlink为以前老版本还是不行 解决方案: 下…

聊天气泡图片的动态拉伸、适配与镜像

聊天气泡图片的动态拉伸、适配与镜像前情提要创建.9.png格式的图片从资源文件夹加载.9.png图片从本地文件加载“.9.png”图片项目痛点进阶探索iOS中的方式Android中的探索构造chunk数据构造padding数据镜像翻转功能屏幕的适配简单封装演示示例一条线段控制的拉伸两条线段控制的…

Pandas 安装与教程

前言Pandas 是 Python 语言的一个扩展程序库,用于数据分析。Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data…

[apidoc]Apidoc-文档生成工具

Apidoc主要是用于生成API文档的工具,可以用于多种语言,包括java、javascript、php等 这里主要是为了写前端的APIDOC,方便交互是双方的使用; 工具的安装 工具包的安装 npm i apidoc [-g|-D]可以-g全局安装,或者-D局部安装,因为…

网盘系统|基于SpringBoot的网盘系统的设计与实现

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

【无功优化】考虑泄流效应的光伏并网点电压系统侧无功优化(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

软考中级,【软件评测师】经验分享

,以下是我的考试成绩,一次通过很是幸运,希望把我的好运传递给大家,大家都能一次通过谈经验之前,先和大家说说考试的题型以及考试的内容,根据往年的考试题目我们可以很容易得知,软件评测师考试分…

Cisco(62)——PBR策略路由案例

场景1-单下一跳: 拓扑: 需求: R1和R2均连接100.100.100.100,R4看做一台PC,当PC访问100.100.100.100的时候优先走左边,当左边down掉之后切换到右边链路,使用PBR操作。 实现: 1.IP地址等基本配置 R4: R4(config)#no ip routingR4(config)#int e0/0 R4(config-if)#ip add…

Typora自动上传文章图片太难折腾?十三行JavaScript代码足矣

前言 Typora是我用过最爽的markdown文本编辑器了。但是有一点很让人难受,就是在写文章的时候,粘贴上的图片是本地路径。这就导致在复制文章到各大博客平台时发表,图片无法显示。然后需要各种办法去处理文章中的图片,不仅要手动上传…

【学习笔记】【Pytorch】十、线性层

【学习笔记】【Pytorch】九、线性层学习地址主要内容一、前言二、Pytorch的线性层三、Linear类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、前言 在神经网络中,我们通常用线性层来完成两层神经元间的线性变换。 …

【C++】面向对象---继承(万字详解)

目录前言一、继承的定义及概念二、继承方式三、基类和派生类之间的转换四、切片五、继承中的作用域六、派生类中的默认成员函数七、继承中的友元与静态成员继承与友元继承中的静态成员八、棱形继承和虚继承棱形继承虚继承总结前言 继承是面向对象的一个重点,而继承…

活动星投票医疗保障案例推介网络评选微信的投票方式线上免费投票

“医疗保障案例推介”网络评选投票_线上免费投票系统_功能齐全的微信投票_在线免费投票用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投票…

图形编辑器:标尺功能的实现

大家好,我是前端西瓜哥。今天我们来实现图形编辑器的标尺功能。 项目地址: https://github.com/F-star/suika 线上体验: https://blog.fstars.wang/app/suika/ 标尺指的是画布上边和左边的两个有刻度的尺子,作用让用户知道他正在编…