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.hqwc.cn/news/98829.html

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

相关文章

如何培养潜在客户?看完这篇你就懂了

图片来源于&#xff1a;SaleSmartly官网 有效的潜在客户培育策略将帮助您将更多潜在客户转化为付费客户。 但是&#xff0c;这并不总是那么容易——您必须与其他公司争夺受众的注意力&#xff0c;并向您的领导证明为什么值得投资您的产品或服务。在本文中&#xff0c;我将向您展…

Java 中数据结构HashSet的用法

Java HashSet HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#xff0c;即不会记录插入的顺序。 HashSet 不是线程安全的&#xff0c; 如果多个线程尝试同时修改 HashSet&#xff0c;则最终结果是…

Leetcode---360周赛

题目列表 2833. 距离原点最远的点 2834. 找出美丽数组的最小和 2835. 使子序列的和等于目标的最少操作次数 2836. 在传球游戏中最大化函数值 一、距离原点最远的点 这题主要是理解题意&#xff0c;遇到L往左走&#xff0c;遇到R往右走&#xff0c;遇到_左右都可以走&#x…

java八股文面试[数据库]——最左匹配原则

最佳左前缀法则 最佳左前缀法则: 如果创建的是联合索引,就要遵循该法则. 使用索引时&#xff0c;where后面的条件需要从索引的最左前列开始使用,并且不能跳过索引中的列使用。 最左匹配原则是什么&#xff1f; 简单来讲&#xff1a;在联合索引中&#xff0c;只有左边的字段被…

postgres源码解析55 Brin Index--2(brinbuild流程)

上一篇讲解了brin index的基本概念以及页布局postgres源码解析54 Brin Index–1&#xff0c;后续会从源码角度对索引的构建、维护等方面进行深入讲解。 1 关键数据结构 2 brinbuild执行流程图 3 brinbuild 函数详解 1 首先调用brin_matepage_init初始化brin meta元数据页&…

CS420 课程笔记 P4 - 以16进制形态编辑游戏文件

文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制&#xff0c;主要用于编辑保存文件&#xff0c;但十六进制编辑涉及的技能可以很好地转移到&#xff1a; Save file editingRe…

gitlab-runner安装和部署项目

目录 1.安装gitlab-runner 1.1 添加官方仓库 1.2.1 安装最新版本 1.2.2 安装指定版本&#xff08;可选&#xff09; 1.2.3 更新runner&#xff08;可选&#xff09; 1.3 随便点开gitlab上的一个项目 1.4 gitlab-runner的注册 2.配置gitlab-runner 3.runner一些命令 gi…

K8S:K8S自动化运维容器Docker集群

文章目录 一.k8s概述1.k8s是什么2.为什么要用K8S3.作用及功能4.k8s容器集群管理系统 二.K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三.K8S的集群架构四、K8S的核心组件1、Master组件2、配置存…

Bridge Champ举办人机对战赛:NFT游戏与传统竞技共生发展编织新格局

概要 现在,NFT与体育竞技正日益紧密地联系在一起。一些体育项目开始推出与赛事或球队相关的NFT,同时也有部分NFT游戏开始举办电子竞技赛事。这种共生发展正在改变体育竞技的生态。 笔者采访了桥牌冠军项目相关负责人,探讨NFT游戏与传统体育竞技的融合潜力。桥牌冠军近期成功举…

基于RabbitMQ的模拟消息队列之五——虚拟主机设计

文章目录 一、创建VirtualHost类二、初始化三、API1.创建交换机2.删除交换机3.创建队列4.删除队列5.创建绑定6.删除绑定7.发送消息转发规则 8.订阅消息1.消费者管理2.推送消息给消费者 3.添加一个消费者管理ConsumerManager9.确认消息 创建VirtualHost类。 1.串起内存和硬盘的数…

网站用户体验之深度感悟

个性化定制界面和极简版原装界面&#xff0c;哪一个你用起来更加顺手呢&#xff0c;相比之下你更喜欢哪一个&#xff1f; 界面选择&#xff1a; &#xff08;提醒&#xff1a;仅个人感悟。~~&#xff09; 方向一&#xff1a;表明自己的喜好 我个人觉得更喜欢个性化定制界面。…

SI24R1/NRF24L01P引脚及软硬件中文开发资料

NRF24L01P芯片兼容通信。从而被打上了国产NRF24L01P的标签&#xff0c;更有甚者居然磨掉芯片原本的SI24R1的LOGO打成NRF24L01P&#xff0c;给很多客户产生了很多不必要的损失。大家定向的理解&#xff0c;国产的东西总是会比国外进口的相差到哪里哪里&#xff0c;如此云云。其实…