当前位置: 首页 > news >正文

重载赋值运算符

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;
}

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

相关文章:

  • antd vue a-select 下拉框模糊查询失效解决方法
  • Android 图像切换器:实现动态图像切换的关键技术与应用
  • SQLyog脚本无限试用重置脚本
  • 【数据结构】(6.2)堆的应用——Top-K问题(C语言)
  • redis学习(005 java客户端 RedisTemplate学习)
  • C#中PostgreSql操作类的设计
  • golang实现网卡流量监控
  • MySQL之备份与恢复(六)
  • 【Git 学习笔记】第二章 Git 的配置(上)
  • 使用ChatGPT写论文,只需四步突破论文写作瓶颈!
  • 昆虫学(书籍学习资料)
  • 基于深度学习的图像背景剔除
  • QML-Grid和OpacityMask
  • [go-zero] 简单微服务调用
  • 华为交换机 LACP协议
  • 07.Android之多媒体问题
  • 4. 路由到控制器 - Laravel从零开始教程
  • angular组件开发
  • Bootstrap JS插件Alert源码分析
  • CSS 三角实现
  • es的写入过程
  • ES学习笔记(12)--Symbol
  • Golang-长连接-状态推送
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Java 多线程编程之:notify 和 wait 用法
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JS 面试题总结
  • SOFAMosn配置模型
  • SQLServer之创建显式事务
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 力扣(LeetCode)22
  • 前端
  • 前端路由实现-history
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 树莓派 - 使用须知
  • 网络应用优化——时延与带宽
  • 学习HTTP相关知识笔记
  • #FPGA(基础知识)
  • #知识分享#笔记#学习方法
  • (+4)2.2UML建模图
  • (07)Hive——窗口函数详解
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (六)DockerCompose安装与配置
  • (生成器)yield与(迭代器)generator
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)菜鸟学数据库(三)——存储过程
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .DFS.
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .naturalWidth 和naturalHeight属性,
  • .NET 药厂业务系统 CPU爆高分析
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)