C++零碎记录(四)

6. 深拷贝与浅拷贝

① 浅拷贝:简单的赋值拷贝操作。

② 深拷贝:在堆区重新申请空间,进行拷贝操作。

③ 浅拷贝,如下图所示,带来的问题就是堆区的内存重复释放。

④ 深拷贝,如下图所示,在堆区自己创建一份内存,可以避免堆区的内存重复释放。

#include <iostream>
using namespace std;class Person
{
public:Person(){cout << "Person的默认构造函数调用" << endl;}Person(int age,int height){m_Age = age;m_Height = new int(height);   //把数据创建在堆区,用指针接收new创建的地址cout << "Person的有参构造函数调用" << endl;}//自己实现拷贝函数 解决浅拷贝带来的问题Person(const Person& p){cout << "Person 拷贝构造函数调用" << endl;m_Age = p.m_Age;//m_Height = p.m_Height; 编译器默认实现就是这行代码,默认执行的是浅拷贝//浅拷贝带来的问题就是堆区的内存重复释放// 深拷贝操作,在堆区自己创建一份内存m_Height = new int(*p.m_Height);}~Person(){//析构代码,将堆区开辟数据做释放操作cout << "Person的析构函数调用" << endl;if (m_Height != NULL){delete m_Height;    //释放堆区数据}}int m_Age;int * m_Height;
};void test01()
{Person p1(18,160);cout << "p1的年龄为:" << p1.m_Age << "身高为:" << * p1.m_Height << endl; //指针通过解引用获得数据Person p2(p1);cout << "p2的年龄为:" << p2.m_Age << "身高为:" << * p2.m_Height << endl;}int main()
{test01();system("pause");return 0;}

运行结果:

  • Person的有参构造函数调用
  • p1的年龄为:18身高为:160
  • Person 拷贝构造函数调用
  • p2的年龄为:18身高为:160
  • Person的析构函数调用
  • Person的析构函数调用
  • 请按任意键继续. . .

7. 初始化列表

① C++提供了初始化列表语法,用来初始化属性。

② 语法:构造函数(): 属性1(值1),属性2(值2),...,()

7.1 传统初始化操作

#include <iostream>
using namespace std;class Person
{
public://传统初始化操作Person(int a, int b, int c){m_A = a;m_B = b;m_C = c;}int m_A;int m_B;int m_C;
};void test01()
{Person p(10, 20, 30);cout << "m_A:" << p.m_A << endl;cout << "m_B:" << p.m_B << endl;cout << "m_C:" << p.m_C << endl;}int main()
{test01();system("pause");return 0;}

运行结果:

  • m_A:10
  • m_B:20
  • m_C:30
  • 请按任意键继续. . .

7.2 灵活初始化操作

#include <iostream>
using namespace std;class Person
{
public:/*构造函数型的初始化操作固定初始化10、30、40Person():m_A(10),m_B(30),m_C(40){}int m_A;int m_B;int m_C;*///可以灵活的初始化Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c){}int m_A;int m_B;int m_C;
};void test01()
{Person p(30, 20, 10);cout << "m_A:" << p.m_A << endl;cout << "m_B:" << p.m_B << endl;cout << "m_C:" << p.m_C << endl;}int main()
{test01();system("pause");return 0;}

运行结果:

  • m_A:30
  • m_B:20
  • m_C:10
  • 请按任意键继续. . .

8. 类对象作为类成员

① C++类中的属性、方法称为成员。

② C++类中的成员可以是另一个类的对象,称该成员为对象成员。

③ B类中有对象A作为成员,A为对象成员,那么当创建B对象时,A与B的构造和析构的顺序是:

1. 当其他类对象作为本类成员,构造时候先构造其他类对象,在构造自身。
2. 当其他类对象作为本类成员,析构的顺序与构造相反,想析构自身,再析构其他类对象。
#include <iostream>
using namespace std;//手机类
class Phone
{
public:Phone(string pName){cout << "Phone的构造函数调用" << endl;m_PName = pName;}~Phone(){cout << "Phone的析构代码函数调用" << endl;}string m_PName;
};//人类
class Person
{
public://m_Phone(pName) 中m_Phone为phone对象,此语句类似于隐式转换法 Phone m_Phone = pName  Person(string name, string pName) :m_Name(name), m_Phone(pName) //掉用的是灵活初始化列表      {cout << "Person的构造函数调用" << endl;}~Person(){cout << "Person的析构代码函数调用" << endl;}//姓名string m_Name;//手机Phone m_Phone;
};//当其他类对象作为本类成员,构造时候先构造其他类对象,在构造自身。
//当其他类对象作为本类成员,析构的顺序与构造相反,想析构自身,再析构其他类对象
void test01()
{Person p("张三", "苹果MAX");cout << p.m_Name << "m_A:" << p.m_Phone.m_PName << endl;
}int main()
{test01();system("pause");return 0;}

运行结果:

  • Phone的构造函数调用
  • Person的构造函数调用
  • 张三m_A:苹果MAX
  • Person的析构代码函数调用
  • Phone的析构代码函数调用
  • 请按任意键继续. . .

链接:https://www.zhihu.com/question/437657370/answer/1692846096

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

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

相关文章

深度学习-4-二维目标检测-YOLOv5源码测试与训练

本文采用的YOLOv5源码是ultralytics发行版3.1 YOLOv5源码测试与训练 1.Anaconda环境配置 1.1安装Anaconda Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 官方网址下载安装包&…

pdf怎么编辑文字?了解一下这几种编辑方法

pdf怎么编辑文字&#xff1f;PDF文件的普及使得它成为了一个重要的文件格式。然而&#xff0c;由于PDF文件的特性&#xff0c;它们不可直接编辑&#xff0c;这就使得PDF文件的修改变得比较麻烦。但是&#xff0c;不用担心&#xff0c;接下来这篇文章就给大家介绍几种编辑pdf文字…

go语言基本操作---三

变量的内存和变量的地址 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于java语言和C/C语言之间&#xff0c;它即没有想Java语言那样取消了代码对指针的直接操作的能力&#xff0c;也避免了C/C语言中由…

Redis面试题(笔记)

目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 小结 4.缓存-双写一致性 5.缓存-持久性 6.缓存-数据过期策略 7.缓存-数据淘汰策略 数据淘汰策略-使用建议 数据淘汰策略总结 8.redis分布式锁 setnx redission 主从一致性 9.主从复制、主从同步 10.哨兵模式 服务状态监…

最快1个月录用!9月SCI/SSCI/EI刊源表已更新!

2023年9月SCI/SSCI/EI期刊目录更新 2023年9月份刊源表已更新&#xff01;计算机、医学、工程、环境、SSCI均有新增期刊&#xff0c;1区(TOP)&#xff0c;最快1个月录用&#xff0c;好刊版面紧俏&#xff0c;切莫错失机会&#xff01; 01 计算机领域 02 医学与制药领域 03 工…

桌面应用小程序,一种创新的跨端开发方案

Qt Group在提及2023年有桌面端应用程序开发热门趋势时&#xff0c;曾经提及三点&#xff1a; 关注用户体验&#xff1a;无论您是为桌面端、移动端&#xff0c;还是为两者一起开发应用程序&#xff0c;有一点是可以确定的&#xff1a;随着市场竞争日益激烈&#xff0c;对产品的期…

Python爬取天气数据并进行分析与预测

随着全球气候的不断变化&#xff0c;对于天气数据的获取、分析和预测显得越来越重要。本文将介绍如何使用Python编写一个简单而强大的天气数据爬虫&#xff0c;并结合相关库实现对历史和当前天气数据进行分析以及未来趋势预测。 1 、数据源选择 选择可靠丰富的公开API或网站作…

电子科大软件系统架构设计——面向对象建模基础

文章目录 面向对象建模基础UML建模语言UML模型图用例图活动图类图顺序图通信图状态机图构件图部署图包图对象图组合结构图扩展图交互概览图时间图 BPMN建模语言业务建模定义模型元素流对象活动事件网关 流数据人工制品泳池和泳道 建模案例订单采购流程建模电商系统订货业务流程…

搭建最简单的SpringBoot项目

1、创建maven项目 2、引入父pom <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version> </parent> 3、引入springboot-web依赖 <dependency…

React【React是什么?、创建项目 、React组件化、 JSX语法、条件渲染、列表渲染、事件处理】(一)

文章目录 React是什么&#xff1f; 为什么要学习React React开发前准备 创建React项目 React项目结构简介 React组件化 初识JSX 渲染JSX描述的页面 JSX语法 JSX的Class与Style属性 JSX生成的React元素 条件渲染&#xff08;一&#xff09; 条件渲染 &#xff0…

系统架构技能之设计模式-工厂模式

一、开篇 本文主要是讲述设计模式中最经典的创建型模式-工厂模式&#xff0c;本文将会从以下几点对工厂模式进行阐述。 本文将会从上面的四个方面进行详细的讲解和说明&#xff0c;当然会的朋友可以之处我的不足之处&#xff0c;不会的朋友也请我们能够相互学习讨论。 二、摘…

Java后端开发面试题——企业场景篇

单点登录这块怎么实现的 单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称SSO&#xff09;,只需要登录一次&#xff0c;就可以访问所有信任的应用系统 JWT解决单点登录 用户访问其他系统&#xff0c;会在网关判断token是否有效 如果token无效则会返回401&am…

C#循环定时上传数据,失败重传解决方案,数据库标识

有些时候我们需要定时的上传一些数据库的数据&#xff0c;在数据不完整的情况下可能上传失败&#xff0c;上传失败后我们需要定时在重新上传失败的数据&#xff0c;该怎么合理的制定解决方案呢&#xff1f;下面一起看一下&#xff1a; 当然本篇文章只是提供一个思路&#xff0…

SAP-PP:基础概念笔记-5(物料主数据的MRP1~4视图)

文章目录 前言一、MRP1视图Base Unit of Measure&#xff08;UoM&#xff09;MRP 组采购组ABC 指示器Plant-Specific Material Status 特定的工厂物料状态MRP 类型 MRP TypeMRP 类型 MRP TypeMaster Production Scheduling(MPS) 主生产计划基于消耗的计划(CBP)再订货点Reorder-…

uni-app点击复制指定内容(点击复制)

官方api uni.setClipboardData(OBJECT) uni.setClipboardData({data: 要被复制的内容,success: function () {console.log(success);} });

Liquid UI和Fiori的区别

主要围绕以下几个方面就Liquid UI和Firor来进行比较&#xff1a; 开发周期开发成本稳定性和支援性平台架构 影响Firor决策的因素&#xff1a; 复杂的编程过程&#xff0c;Fiori对开发人员要求高&#xff0c;开发难度大&#xff0c;而Liquid UI让开发人员不需要懂SAP后端&…

yolov5运行过程遇到的小问题(随时更新)

1.关于git的问题 解决办法&#xff1a;插入下面代码 import os os.environ["GIT_PYTHON_REFRESH"] "quiet"2.页面太小无法完成操作 解决办法: 如果不好使再考虑降低Batch_Size大小或者调整虚拟内存可用硬盘空间大小&#xff01;&#xff08;调整虚拟内存…

整理mongodb文档:分页

个人博客 整理mongodb文档:分页 个人博客&#xff0c;求关注&#xff0c;如果文章不够清晰&#xff0c;麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现&#xff0c;这也是这篇博客诞生的理由。 数据准备…

Vue组件之间传值

聊一聊vue里面组件之间的传值 首先总结一下vue里面传值的几种关系&#xff1a; 如上图所示, A与B、A与C、B与D、C与F组件之间是父子关系&#xff1b; B与C之间是兄弟关系&#xff1b;A与D、A与E之间是隔代关系&#xff1b; D与F是堂兄关系&#xff0c;针对以上关系 我们把组件…

Redis 缓存穿透击穿和雪崩

一、说明 Redis 缓存的使用&#xff0c;极大的提升了应用程序的性能和效率&#xff0c;特别是数据查询方面。但同时&#xff0c;它也带来了一些问题。其中&#xff0c;最要害的问题&#xff0c;就是数据的一致性问题&#xff0c;从严格意义上讲&#xff0c;这个问题无解。如果对…