C++类和对象(4)

news2025/1/13 3:07:53

C++类和对象

  • 1.拷贝构造函数
    • 1.1 概念
    • 1.2. 特征
      • 1.2.1. 拷贝构造函数构造函数的一种重载形式;
      • 1.2.2. 拷贝构造函数的参数只能有一个,是对本类类型对象的引用,不能是传值调用,编译会直接报错,或者是直接进入死循环。
      • 1.2.3. 若未显示定义拷贝构造函数,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数按内存存储字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
      • 1.2.4. 编译器生成的默认拷贝构造函数是一种浅拷贝
      • 1.2.5. 拷贝构造函数典型调用场景
  • 2.运算符重载
  • 2.1 问题提出

1.拷贝构造函数

1.1 概念

在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。
在这里插入图片描述
那在创建对象时,可否创建一个与已存在对象一某一样的新对象呢?

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

1.2. 特征

拷贝构造函数是一种特殊成员函数,其特征如下:

1.2.1. 拷贝构造函数构造函数的一种重载形式;

1.2.2. 拷贝构造函数的参数只能有一个,是对本类类型对象的引用,不能是传值调用,编译会直接报错,或者是直接进入死循环。

class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
// Date(const Date& d)  // 正确写法
  Date(const Date& d)  // 错误写法:编译报错,会引发无穷递归
{
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2(d1);
return 0;
}

在这里插入图片描述
注意:调用拷贝构造函数是在定义新类的时候调用的,如果两个已经定义了两个类的类型d1、d2,d1=d2是赋值运算符的重载,是简单的拷贝,不会调用拷贝构造函数!

所以,在写拷贝构造函数的时候,如果用传值调用,会出现一直调用拷贝构造函数的情况,则会出现没有尽头的递归调用。
在这里插入图片描述

1.2.3. 若未显示定义拷贝构造函数,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数按内存存储字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

在这里插入图片描述
注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

1.2.4. 编译器生成的默认拷贝构造函数是一种浅拷贝

在这里插入图片描述
在这里插入图片描述
注意:类中如果没有涉及资源申请的时候,可以不用写拷贝构造函数,使用默认的拷贝构造函数即可;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝。

1.2.5. 拷贝构造函数典型调用场景

  • 使用已存在的对象创建新的对象
  • 函数参数类型为类类型对象
  • 函数返回值类型是类类型

在这里插入图片描述

在这里插入图片描述
用新定义类类型对象接受函数的返回值的时候,编译会优化,只会调用一次拷贝构造函数,把连续的两次调用合并成一次。

为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。

2.运算符重载

2.1 问题提出

比较日期的大小
【如果函数这样写】
在这里插入图片描述
在这里插入图片描述
函数定义的时候没有依据功能命名,也没有添加注释,则函数调用的时候就难以知道函数的功能是什么,再次读函数的时候就很难理解。如果类之间的比较可以用> 或<符号就会显得很简单了,所以这就要用到运算符重载的关键字operator。
在这里插入图片描述
在这里插入图片描述
这样子就会显得简单易懂

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

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

相关文章

wvp开发环境搭建

代码下载地址 代码下载地址 https://gitee.com/pan648540858/wvp-GB28181-pro.git 开发工具 采用jetbrain idea 利用开发工具下载代码 文件-新建-来自版本控制的项目 url是上面的代码下载链接,点击克隆即可 下图是已经克隆并打开的代码 安装依赖环境 安装redi…

基于html+css的图展示44

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Linux套接字编程

在上一篇博客中我们对网络中一些基本概念进行了简单阐述,这一篇博客我们来对套接字编程的内容进行初步了解。 目录 1.引入 2.UDP协议 2.1通信两端流程 2.1.1服务端流程 2.1.2客户端流程 2.2套接字相关操作接口 2.2.1创建套接字 2.2.2为套接字绑定地址信息 …

SSL证书周期变为90天? 锐成让您轻松应对行业新规

3月3日,谷歌在其“Move Forward, Together”栏目中,称已向CA/B论坛发起了投票提案,建议将公共TLS(也称为SSL)证书的最长有效期从398天减少到90天。值得注意的是,即便CA/B论坛没有通过这一提议,谷…

【C语言】函数讲解(下)

【C语言】函数讲解(下) 1.函数的声明和定义1.1函数声明1.2函数定义 2.函数的嵌套调用和链式访问2.1嵌套调用2.2链式访问 3.函数递归3.1什么是递归3.2递归的两个必要条件3.2.1练习13.2.2练习2 3.3递归与迭代3.3.1练习13.3.2练习2 所属专栏:C语…

Android Jetpack—LiveData

1.LiveData LiveData是Android Jetpack包提供的一种可观察的数据存储器类,它可以通过添加观察者被其他组件观察其变更。不同于普通的观察者,LiveData最重要的特征是它具有生命周期感知能力,它遵循其他应用组件(如 Activity、Frag…

软件测试—进阶篇

软件测试—进阶篇 🔎根据测试对象划分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装卸载测试安全性测试性能测试内存泄漏测试 🔎根据是否查看代码划分黑盒测试白盒测试灰盒测试 🔎根据开发阶段划分单元测试集成测试系统测试…

mulesoft MCIA 破釜沉舟备考 2023.04.27.25 (易错题)

@[TOC](mulesoft MCIA 破釜沉舟备考 2023.04.27.25 (易错题)) 1. According to MuleSoft, which deployment characteristic applies to a microservices application architecture? A. Services exist as independent deployment artifacts and can be scaled independently…

ABeam Insight | 智能制造系列(6):虚拟/增强现实(VR/AR)×智能制造

虚拟现实(VR)和增强现实(AR)的概念早在20世纪60年代就被提出,但由于当时的技术水平无法满足相关应用的需求,这些概念并没有引起广泛关注。直到近年来随着计算机技术的飞速发展,虚拟现实和增强现…

python+nodejs+php+springboot+vue高校教室自习室预约管理系统

建立的自习室预约管理系统用户使用浏览器就可以对其进行访问,管理员在操作上面能够方便管理,因此用户和管理员能够方便对这个系统进行操作。论文全面介绍系统数据库,功能设计和业务流程设计。数据库能够存储自习室预约管理系统需要的数据。 …

Leanback(1)-播放控制栏下添加新的行

我们要在播放控制栏下面加入下面一行。 这个就是标准的row。 leanback的原理 Android Leanback结构源码简析 - 简书 我们知道Row用来提供数据,row可以通过一个ObjectAdapter来管理和提供数据 我们知道presenter是一个负责将数据绑定到视图上的对象,它可以…

基于STM32的智能语音垃圾桶设计

一. 系统设计及框图: 本设计整体功能如下: 1. 超声波感应到有人靠近时语音提示“垃圾放置请分类”。 2. 检测垃圾筒时是否满,当满时语音提示“垃圾桶已满”。 3. 光传感器检测,指示灯指示。 4. 语音识别不同的垃圾类型。 二.…

前端程序员的职业发展规划与路线——ChatGPT的回答

文章目录 一、前端程序员的职业规划是?回答1: 作为一个前端开发程序员,您的职业发展路线可能如下:回答2:作为前端开发程序员,您的职业发展路线可能如下:回答3: 你的职业发展路线可能…

ASEMI代理ADI亚德诺ADM3051CRZ-REEL7车规级芯片

编辑-Z ADM3051CRZ-REEL7芯片参数: 型号:ADM3051CRZ-REEL7 显性状态:78 mA 隐性状态:10 mA 待命状态:275μA CANH输出电压:4.5V CANL输出电压:2V 差动输出电压:3V 输入电压…

【AI生产力工具】Upscale.media:用AI技术提升照片质量,让你的作品更出色

文章目录 简介一、Upscale.media是什么?二、如何使用Upscale.media?三、总结 简介 在如今的数字时代,图片已经成为我们日常生活中不可或缺的一部分,从社交媒体到电子商务网站,从广告宣传到个人生活,都需要…

璀璨盛启·焕美升级 上颜集团杭州医学旗舰中心盛大启幕

2023年4月26日,「璀璨盛启焕美升级」上颜杭州医学旗舰中心启幕盛典在杭州滨江钱龙大厦耀新启幕。上颜用审美、匠心构建城市的活力与色彩,致力于为客户带来全新的美丽方式和一流的品质服务。 (上台剪彩嘉宾从左至右依次为)上颜集团…

CSS3小可爱亲吻表白特效,给你的五一假期增添点小乐趣

马上五一假期了,小伙伴们是不是都准备出去旅游呢,或者回老家陪陪父母。今天我用CSS3制作一个小可爱亲吻表白的特效,来给你即将到来的五一假期增添点小小的乐趣。 目录 实现思路 左边小可爱的实现 右边小可爱的实现 左右摇摆动效的实现 右…

LeetCode43. 字符串相乘(Java解法)

0 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 “2”, num2 “3” 输出…

【三十天精通 Vue 3】 专栏内容介绍

在这个专栏中,我们将带你深入了解 Vue 3 的各个方面。首先,我们将带你了解 Vue 3 的新特性和改进,包括 Composition API、Provide/Use Case、Vuex 3 等。然后,我们将详细介绍 Vue 3 的组件化开发、路由、状态管理等方面的内容。 …

LineSegmentIntersector::Intersections中ratio含义及LineSegmentIntersector相交点说明

osg用osgUtil库中的LineSegmentIntersector、IntersectionVisitor类来求线段和三维模型的交点 如下代码&#xff1a; #include <QtCore/QCoreApplication> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgViewer…