C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究

C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究

code review!

文章目录

  • C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究
    • 1.传递对象的const引用——ClassB的实例只能访问ClassA的实例,但不会修改ClassA的实例
    • 2.传递对象的非const引用——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例
    • 3.传递对象的指针——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例
    • 4.传递对象的指针并在堆上初始化该对象
    • 5.传递对象的指针并在堆上初始化该对象(非通过构造函数传递参数)
    • 6.关于深浅拷贝

1.传递对象的const引用——ClassB的实例只能访问ClassA的实例,但不会修改ClassA的实例

在这里插入图片描述

代码

class ClassA {
public:
    ClassA(int value) : memberA(value) {}
private:
    int memberA;
};

class ClassB {
public:
    ClassB(const ClassA& aInstance) : memberB(aInstance) {}
private:
    ClassA memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(objA);
    return 0;
}

2.传递对象的非const引用——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例

在这里插入图片描述

代码

class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB(ClassA& aInstance) : memberB(aInstance) {
        // 在这里可以修改 aInstance 的状态
        aInstance.doSomething();  // 调用 ClassA 的方法
    }
private:
    ClassA& memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(objA);
    return 0;
}

3.传递对象的指针——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例

在这里插入图片描述

代码

class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB(ClassA* aInstance) : memberB(aInstance) {
        // 在这里可以使用 memberB 指针来操作 aInstance
        memberB->doSomething();  // 调用 ClassA 的方法
    }
private:
    ClassA* memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(&objA);  // 传递指向 objA 的指针
    return 0;
}

4.传递对象的指针并在堆上初始化该对象

在这里插入图片描述

代码

class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB() : memberB(nullptr) {
        // 在构造函数中初始化 memberB 在堆上分配的对象
        memberB = new ClassA(0); // 在这里可以使用适当的参数来初始化 ClassA
    }

    // 析构函数中释放成员变量指向的内存
    ~ClassB() {
        delete memberB;
    }

    void performAction() {
        if (memberB) {
            memberB->doSomething();
        }
    }

private:
    ClassA* memberB;
};

int main() {
    ClassB objB;
    objB.performAction();  // 调用 memberB 对象的方法
    return 0;
}

5.传递对象的指针并在堆上初始化该对象(非通过构造函数传递参数)

在这里插入图片描述

在这里插入图片描述

代码

class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB() : memberB(nullptr) {}

    // 析构函数中释放成员变量指向的内存
    ~ClassB() {
        delete memberB;
    }

    void init(ClassA* aInstance) {
        // 在堆上分配内存并进行初始化
        memberB = new ClassA(*aInstance);
    }

    void performAction() {
        if (memberB) {
            memberB->doSomething();
        }
    }

private:
    ClassA* memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB;
    objB.init(&objA);  // 在堆上分配内存并初始化 memberB
    objB.performAction();  // 调用 memberB 对象的方法
    return 0;
}

6.关于深浅拷贝

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js:Markdown编辑器Vue3版本md-editor-v3

文档 https://github.com/imzbf/md-editor-v3https://imzbf.github.io/md-editor-v3/zh-CN/index 安装 npm install md-editor-v3使用 <template><MdEditor v-model"text" /> </template><script setup> import { ref } from vue; impor…

EFLFK——ELK日志分析系统+kafka+filebeat架构(3)

zookeeperkafka分布式消息队列集群的部署 紧接上期&#xff0c;在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&#xff1a;192.168.116.40&#xff0c;修改配置将采集到的日志转发给kafka&#xff1b; kafka集群&#xff…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置&#xff1a;CentOs 7.6以上版本&#xff0c;我的版本是7.9&#xff0c;不要对yum换源&#xff0c;否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令&#xff0c;是…

网络优化工程师,你到底了解多少?

5G网络优化工程师到底是什么&#xff1f; 5G&#xff0c;第五代移动通信技术&#xff08;5th Generation Mobile Communication Technology&#xff0c;简称5G&#xff09;是具有高速率、低时延和大连接特点的新一代宽带移动通信技术&#xff0c;5G通讯设施是实现人机物互联的…

【MySQL】sql字段约束

在MySQL中&#xff0c;我们需要存储的数据在特定的场景中需要不同的约束。当新插入的数据违背了该字段的约束字段&#xff0c;MySQL会直接禁止插入。 数据类型也是一种约束&#xff0c;但数据类型这个约束太过单一&#xff1b;比如我需要存储的是一个序号&#xff0c;那就不可…

也谈态势感知的嵌套与级联

不同颗粒度的态势感知可以嵌套在一起&#xff0c;形成一个层次结构&#xff0c;从而提供全面和多层次的信息获取和理解。 在态势感知中&#xff0c;颗粒度可以理解为观察、收集和分析信息的细节程度。较高颗粒度的态势感知关注的是具体的事件、行动或细节&#xff0c;提供了详细…

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 &#x1f340;引言&#x1f340;训练集和测试集&#x1f340;sklearn中封装好的train_test_split&#x1f340;超参数 &#x1f340;引言 本节以KNN算法为主&#xff0c;简单介绍一下训练集和测试集、超参数 &#x1f340;训练集和测试集 训练集和测试集是机器学习和深…

在工作中使用ChatGPT需要担心泄密问题吗?

​OpenAI的ChatGPT可以通过自动简化繁琐的任务&#xff0c;针对挑战性问题的提供创造性的解决方案来提高员工的生产力。但随着这项技术被整合到人力资源平台和其他工作场所中&#xff0c;它给各个企业带来了巨大的挑战。苹果、Spotify、Verizon和三星等大公司已禁止或限制员工在…

Spring自定义参数解析器设计

1.什么是参数解析器 RequstBody、RequstParam 这些注解是不是很熟悉&#xff1f; 我们在开发Controller接口时经常会用到此类参数注解&#xff0c;那这些注解的作用是什么&#xff1f;我们真的了解吗&#xff1f; 简单来说&#xff0c;这些注解就是帮我们将前端传递的参数直…

微信小程序--原生

1&#xff1a;数据绑定 1&#xff1a;数据绑定的基本原则 2&#xff1a;在data中定义页面的数据 3&#xff1a;Mustache语法 4&#xff1a;Mustache的应用场景 1&#xff1a;常见的几种场景 2&#xff1a;动态绑定内容 3&#xff1a;动态绑定属性 4&#xff1a;三元运算 4&am…

【阻止IE强制跳转到Edge浏览器】

由于微软开始限制用户使用Internet Explorer浏览网站&#xff0c;IE浏览器打开一些网页时会自动跳转到新版Edge浏览器&#xff0c;那应该怎么禁止跳转呢&#xff1f; 1、点击电脑左下角的“搜索框”或者按一下windows键。 2、输入“internet”&#xff0c;点击【Internet选项…

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

&#x1f4e2;前言&#xff1a;本篇是关于如何使用YoloV5Deepsort训练自己的数据集&#xff0c;从而实现目标检测与目标追踪&#xff0c;并绘制出物体的运动轨迹。本章讲解的为第一个内容&#xff1a;简单介绍YoloV5Deepsort中所用到的目标检测&#xff0c;追踪及sort&Depp…

什么是进程、线程、协程

什么是进程&#xff1f; 我们都知道计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序…

CSS 的选择器有哪些种类?分别如何使用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素选择器&#xff08;Element Selector&#xff09;⭐ 类选择器&#xff08;Class Selector&#xff09;⭐ ID 选择器&#xff08;ID Selector&#xff09;⭐ 后代选择器&#xff08;Descendant Selector&#xff09;⭐ 子元素选择器&a…

嵌入式开发学习(STC51-7-矩阵按键)

内容 按下S1-S16键&#xff0c;对应数码管最左边显示0-F 矩阵按键简介 独立按键与单片机连接时&#xff0c;每一个按键都需要单片机的一个I/O 口&#xff0c;若某单片机系统需较多按键&#xff0c;如果用独立按键便会占用过多的I/O口资源&#xff1b;而单片机 系统中I/O口资…

C++利用mutex和thread实现一个死锁

程序 #include<iostream> #include<mutex> #include<thread> using namespace std; mutex mtx1; mutex mtx2; void A(){mtx1.lock();cout<<"a:mtx1"<<endl;this_thread::sleep_for(chrono::milliseconds(1000));mtx2.lock();cout<…

【Sa-Token】9、Sa-Token实现在线用户管理功能

尽管框架将大部分操作提供了简易的封装&#xff0c;但在一些特殊场景下&#xff0c;我们仍需要绕过框架&#xff0c;直达数据底层进行一些操作。 1、官方文档 会话查询 https://sa-token.cc/doc.html#/up/search-sessionSa-Token提供以下API助你直接操作会话列表&#xff1a…

【C++基础】友元总结一些坑

友元类 友元类&#xff08;Friend Class&#xff09;是一种在C中用于实现类之间访问权限的特殊机制。通过友元类&#xff0c;一个类可以允许另一个类访问其私有成员&#xff0c;甚至可以使另一个类成为其友元&#xff0c;使其能够访问所有成员&#xff0c;包括私有成员。这种机…

python爬虫2:requests库-原理

python爬虫2&#xff1a;requests库-原理 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 目录结构 文章目录 python爬虫2&#xff1a;requests库-原理1. 概述2. re…

学习笔记-JVM-对象结构及生命周期

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 对象的创建流程 常量池检查:检查new指令是否能在常…