重载赋值运算符

c++编译器可能会给类添加四个函数

1默认构造函数

2默认析构函数

3默认拷贝构造函数,对成员变量进行浅拷贝。

4默认赋值函数,队成员变量进行浅拷贝。

#include<iostream>
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout << "编号: " << m_bh << ", 姓名:" << m_name << endl; }
};
int main() {CGirl g1, g2;g1.m_bh = 8;g1.m_name = "zhongge";g1.show();g2.show();return 0;
}

定义一个CGirl类有公有成员编号和姓名,还有个show方法输出姓名编号

创建俩对象g1 g2给g1赋值不给g2赋值

现在让 g2=g1;并展示g2

#include<iostream>
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout << "编号: " << m_bh << ", 姓名:" << m_name << endl; }
};
int main() {CGirl g1, g2;g1.m_bh = 8;g1.m_name = "zhongge";g1.show();g2 = g1;//行代码就是对象的赋值运算,和普通变量的赋值不一样,普通变量的赋值是一对一的关系。对象的赋值是多对多的,但也是一一对应的。g2.show();return 0;
}

对象的赋值运算是用一个已经存在了的对象给另一个已经存在的对象赋值。

如果类的定义没有重载赋值函数,编译器就会提供一个默认的赋值函数,如果类中重载了赋值函数,编译器将不提供默认赋值函数。

重载复制函数的语法:

类名 & operator=(const 类名 & 源对象);

#include<iostream>
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout << "编号: " << m_bh << ", 姓名:" << m_name << endl; }CGirl& operator=(const CGirl& g) {this->m_bh = g.m_bh;this->m_name = g.m_name;cout << "调用了重载赋值函数" << endl;return *this;}
};
int main() {CGirl g1, g2;g1.m_bh = 8;g1.m_name = "zhongge";g1.show();g2 = g1;g2.show();return 0;
}

编译器提供的默认赋值函数是浅拷贝,如果对象中不存在堆区内存空间,默认赋值函数可以满足需求,否则要用深拷贝。

重载赋值函数深拷贝的代码:

#include<iostream>
using namespace std;
class CGirl
{
public:int m_bh;string m_name;int* m_ptr;CGirl() { m_ptr = nullptr; }~CGirl() { if (m_ptr)delete m_ptr; }void show() { cout << "编号: " << m_bh << ", 姓名:" << m_name <<", m_ptr="<<m_ptr<< endl; }CGirl& operator=(CGirl& g) {this->m_bh = g.m_bh;this->m_name = g.m_name;if (g.m_ptr = nullptr) {if (m_ptr != nullptr) { delete m_ptr; m_ptr = nullptr; }}else {if (m_ptr == nullptr)m_ptr = new int;memcpy(m_ptr, g.m_ptr, sizeof(int));}cout << "调用了重载赋值函数" << endl;return *this;}
};
int main() {CGirl g1, g2;g1.m_ptr = new int(3);g1.show();g2 = g1;g2.show();return 0;
}

拷贝构造与赋值运算不同,拷贝构造是指原来的对象不存在,用已存在的对象进行构造;赋值运算是指已存在了两个对象,把其中一个对象的成员变量的值赋值给另一个对象的成员变量。

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

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

相关文章

【VUE基础】VUE3第三节—核心语法之computed、watch、watcheffect

computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 创建一个只读的计算属性 ref&#xff1a; <template><div cl…

3033.力扣每日一题7/5 Java

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先创建一个与…

【C++】unordered系列容器的封装

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 unordered系列的封装 1 unordered_map 和 unordered_set2 改造哈希桶2.1 模版参数2.2 加入迭代器 3 上层封装3.1 unordered_set3.2 unordered_map 4 面…

基于springboot的工作绩效管理系统的设计与实现+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

XSS 攻击是什么?如何防护?

1. 什么是 XSS 攻击 跨站脚本攻击&#xff0c;是一种很常见的网络安全威胁。 它允许攻击者在目标浏览器中注入恶意脚本代码。这些恶意脚本会执行多种非法操作。比如盗取你的 cookie&#xff0c;会话信息&#xff0c;篡改网页内容&#xff0c;重定向到别的恶意网站。控制浏览器…

零基础学习MySQL---库的相关操作

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、创建数据库 1.语法 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] .…

Android 简单快速实现 下弧形刻度尺(滑动事件)

效果图&#xff1a; 直接上代码&#xff1a; package com.my.view;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pai…

WordPress付费进群V2主题,多种引流方法,引私域二次变现

全新前端UI界面&#xff0c;多种前端交互特效让页面不再单调&#xff0c;进群页面群成员数&#xff0c;群成员头像名称&#xff0c;每次刷新页面随机更新不重复&#xff0c;最下面评论和点赞也是如此随机刷新不重复 进群页面简介&#xff0c;群聊名称&#xff0c;群内展示&…

JavaScript中的reduce()

reduce() 方法是 JavaScript 数组&#xff08;Array&#xff09;对象的一个非常强大的方法&#xff0c;它允许你对数组中的每个元素执行一个由你提供的 reducer 函数&#xff08;升序执行&#xff09;&#xff0c;将其结果汇总为单个返回值。这个方法非常适用于累加器、数组求和…

010 Volatile和本地线程

文章目录 关键字Volatile可见性&#xff1a;原子性&#xff1a;有序性&#xff1a; 本地线程如何创建ThreadLocal变量如何访问ThreadLocal变量关于InheritableThreadLocal 关键字Volatile Volatile是轻量级的synchronized,在多处理器环境下&#xff0c;可以保证共享变量的可见…

蝙蝠优化算法(Bat Algorithm,BA)及其Python和MATLAB实现

蝙蝠优化算法&#xff08;Bat Algorithm&#xff0c;简称BA&#xff09;是一种基于蝙蝠群体行为的启发式优化算法&#xff0c;由Xin-She Yang于2010年提出。该算法模拟了蝙蝠捕食时在探测目标、适应环境和调整自身位置等过程中的行为&#xff0c;通过改进搜索过程来实现优化问题…

UML2.0-系统架构师(二十四)

1、&#xff08;重点&#xff09;系统&#xff08;&#xff09;在规定时间内和规定条件下能有效实现规定功能的能力。它不仅取决于规定的使用条件等因素&#xff0c;还与设计技术有关。 A可靠性 B可用性 C可测试性 D可理解性 解析&#xff1a; 可靠性&#xff1a;规定时间…

ServiceImpl中的参数封装为Map到Mapper.java中查询

ServiceImpl中的参数封装为Map到Mapper.java中查询&#xff0c;可以直接从map中获取到key对应的value

论文阅读【时间序列】DSformer

论文阅读【时间序列】DSformer arxive: DSformer: A Double Sampling Transformer for Multivariate Time Series Long-term Prediction github: MTST 分类&#xff1a;多变量时间序列&#xff08;Multivariate time series&#xff09; 核心观点 多变量时间序列3个维度信息 …

Spring Cloud Alibaba组件概览

目录 Spring Cloud Alibaba组件概览引言一、Spring Cloud Alibaba概述二、Spring Cloud Alibaba组件概览2.1 Nacos2.1.1 概述2.1.2 特点2.1.3 应用场景2.1.4 实例分析 2.2 Sentinel2.2.1 概述2.2.2 特点2.2.3 应用场景2.2.4 实例分析 2.3 RocketMQ2.3.1 概述2.3.2 特点2.3.3 应…

Android AlertDialog对话框

目录 AlertDialog对话框普通对话框单选框多选框自定义框 AlertDialog对话框 部分节选自博主编《Android应用开发项目式教程》&#xff08;机械工业出版社&#xff09;2024.6 在Android中&#xff0c;AlertDialog弹出对话框用于显示一些重要信息或者需要用户交互的内容。 弹出…

【Linux进阶】磁盘分区2——MBR和GPT

1.磁盘的分区 因为如果你的磁盘被划分成两个分区&#xff0c;那么每个分区的设备文件名是什么&#xff1f; 在了解这个问题之前&#xff0c;我们先来复习一下磁盘的组成&#xff0c;因为现今磁盘的划分与它物理的组成很有关系。 我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马…

Go 语言 UUID 库 google/uuid 源码解析:时钟信息

google/uuid 库地址 google/uuid 时间相关的部分汇聚在 uuid 包下的 time.go 文件中。 UUID 的 RFC 4122 变体中的版本1和版本2依赖于时钟信息&#xff0c;所以 uuid 库将时钟信息的实现定义在本文件中&#xff0c;供对应版本 UUID 的生成使用。 UUID 依赖于时钟信息的实现版…

5G NR与4G LTE的技术差异

5G NR与4G LTE的技术差异 5G与4G相比&#xff0c;5G(NR)技术有以下优势点&#xff1a; 一、总体技术方面 系统消息 4G(LTE): 支持在任何条件(或情况)下始终开启所有系统消息的广播&#xff0c;导致大量资源浪费&#xff0c;且终端(UE)需要持续评估。 系统信息广播是终端(UE)…

gda动态调试-cnblog

忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法&#xff0c;选择调试方法&#xff0c;gda会自动监听函数的返回值&#xff0c;例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本