嵌入式学习记录6.6(拷贝构造/友元函数/常成员函数)

news2024/11/26 19:35:58

一.拷贝构造函数和拷贝赋值函数

1.1拷贝构造函数功能,格式

拷贝构造函数是一种特殊的构造函数,用来将一个类对象给另一个类对象初始化使用的。

1> 用一个类对象给另一个类对象初始化时,会自动调用拷贝构造函数。

2> 当一个类对作为函数的实参,传递给形参的过程时,会自动调用拷贝构造函数。

3> 当一个函数返回一个类对象时,会自动调用拷贝构造函数。

类名(const 类名 &other)
{
    函数体内容;
}

1.2浅拷贝和深拷贝(重点)

1> 系统会提供一个默认的拷贝构造函数,如果程序员手动定义,则系统取消默认提供。

2> 系统提供的拷贝构造函数,是将一个类对象给另一个类对象初始化使用的,换句话说,就是将一个类对象的所有数据成员赋值给另一个类对象的所有数据成员。

3> 浅拷贝:系统提供的拷贝构造函数。

4> 如果类中没有指针成员,则调用系统提供的拷贝构造函数,没有问题。如果类中有指针成员,依然调用系统提供的拷贝构造函数,则会造成double free现象。

1.3拷贝构造赋值功能,格式

用一个类对象给另一个类对象进行赋值操作,会自动调用拷贝赋值函数

类名 &operator=(const 类名 &other)
{
    函数体内容;
}

用一个类对象给另一个类对象进行赋值操作,会自动调用拷贝赋值函数。

二.友元函数

2.1 作用和种类

作用:可以让一些函数或者类去访问另一类的私有数据成员。

种类:

1> 全局函数做友元

2> 类做友元

3> 成员函数做友元

2.2全局函数做友元

让一个全局函数访问一个类的私有数据成员。

#include <iostream>


using namespace std;


//封装一个房间类
class Room
{
    friend void goodGay(Room &r); //声明该函数是本类的好朋友,可以访问本类的私有数据成员
private:
    string bed_room; //卧室
public:
    string sitting_room; //客厅


public:
    //无参构造函数
    Room()
    {
        bed_room = "卧室";
        sitting_room = "客厅";
    }


};


//全局函数
void goodGay(Room &r)
{
    cout << "好基友正在访问。。" << r.sitting_room << endl;
    cout << "好基友正在访问。。" << r.bed_room << endl;
}


int main()
{
    Room r;
    goodGay(r);
    return 0;
}

2.3类做友元

让一个类去访问另一个类的私有数据成员。

#include <iostream>

using namespace std;


//声明有这样的类
class Room;

//封装好盆友的类
class GoodGay
{
private:
    Room *r;
public:
    GoodGay();
    void visit();
};

class Room
{
    friend class GoodGay; //声明该类是本类的好朋友,可以访问本类的私有数据成员
private:
    string bed_room;
public:
    string sitting_room;

    Room()
    {
        bed_room = "卧室";
        sitting_room = "客厅";
    }
};

GoodGay::GoodGay()
{
    r = new Room;
}
void GoodGay::visit()
{
    cout << "好基友的类 正在访问。。" << r->sitting_room << endl;
    cout << "好基友的类 正在访问。。" << r->bed_room << endl;
}

int main()
{
    GoodGay g;
    g.visit();
    return 0;
}

2.4成员函数做友元(了解)

让一个类中的成员函数去访问另一个类的私有数据成员。

小结

1> 不要过度的使用友元,会降低或者破坏封装性。

2> 友元不具有交换性、传递性、继承性

三.常成员函数和常对象

类中的成员函数都能对数据成员做修改操作,如果设计一个函数不能对数据成员做修改,则需要用常成员函数来完成。

3.1常成员函数

常成员函数不能修改数据成员。

返回值类 函数名(形参列表)const
{
    函数体内容;
}

3.2常对象

常对象的数据成员不能被改变。

格式: const 类名 对象名;

1】非常对象,既可以调用非常成员函数 ,也可以调用常成员函数,优先调用非常成员函数。

2】常对象只能调用常成员函数,不能调用非常成员函数。

#include <iostream>

using namespace std;

class Stu
{
private:
    string name;
    int age;
public:
    Stu()
    {}
    Stu(string name, int age):name(name),age(age)
    {}
    void show() const //常成员函数   this指针原型:Stu const * const this;
    {
        //this->age = 48;
        //this = nullptr;
        //name = "lisi";//不能对数据成员修改
        cout << name << "  " << age << endl;
    }
    void show() //非 常成员函数     this原型: Stu *const this;
    {
        //this->age = 48;
        //this = nullptr;
        cout << name << "  " << age << endl;
    }


};


int main()
{
    //Stu s1("zhangsan", 18); //非常对象


    const Stu s1("zhangsan", 18); //常对象
    s1.show();

    return 0;
}

3.3mutable关键字

mutable修饰的数据成员,表示该数据成员可以在常成员函数中被修改。

四.思维导图

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

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

相关文章

【Linux】Linux环境基础开发工具_5

文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条&#xff0c;不过那仅仅是测试&#xff0c;接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…

前端面试项目细节重难点(已工作|做分享)想(八)

面试官&#xff1a;请你讲讲你在该项目中遇到的印象深刻的问题是什么&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

达梦8 并行查询

达梦数据库可以通过在查询语句加/* parallel */ HINT并行执行。下面以一个排序语句为例 我们通过一条监控语句查询排序区的使用情况。 最初没有查询结果&#xff08;no rows&#xff09; 伴随着语句insert /* parallel(4) */ into d select * from a order by 2执行&#xff…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略&#xff1f;Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略&#xff1f; 由于Redis内存是有大小的&#xff0c;当内存快满的时候&#xff0c;又没有…

解决CSDN 导入Markdown图片失效不显示问题

每次将MarkDown文件导入CSDN的时候&#xff0c;有些图片总是由于防盗链的问题导致图片加载不出来&#xff0c;还得手动再导一遍&#xff0c;极其不方便。所以我们能不能建立一个属于自己的图片服务器或者说在线图库呢&#xff0c;而且每次使用Typora插入图片的时候都会自动的上…

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin&#xff0c;然后在XR Origin上面添加组件 注意&#xff1a;XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件&#xff0c;如下图&am…

差分原理+练习

差分的原理和前缀和相似&#xff0c;我们先联想一下前缀和。 前缀和计算下标从0到n的和&#xff0c;记为sum[n1];如果想要求出[l,r]区间的和&#xff0c;可以快速的通过sum[r1]-sum[l]来得到 。 前缀和适用于需要多次获取指定连续区间和的情景 而差分即计算相邻两个元素的差…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.5,6 SPI驱动实验-ICM20608 ADC采样值

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

【高校科研前沿】新疆生地所陈亚宁研究员团队在GeoSus发文:在1.5°C和2°C全球升温情景下,中亚地区暴露于极端降水的人口增加

目录 文章简介 1.研究内容 2.相关图件 3.文章引用 文章简介 论文名称&#xff1a;Increased population exposures to extreme precipitation in Central Asia under 1.5 ◦C and 2 ◦C global warming scenarios&#xff08;在1.5C和2C全球变暖情景下&#xff0c;中亚地区…

数学建模 —— 灰色系统(4)

目录 什么是灰色系统&#xff1f; 一、灰色关联分析 1.1 灰色关联分析模型 1.2 灰色关联因素和关联算子集 1.2.1 灰色关联因素 1.2.2 关联算子集 1.3 灰色关联公理与灰色关联度 1.3.1 灰色关联度 1.3.2 灰色关联度计算步骤 1.4 广义关联度 1.4.1 灰色绝对关联…

[AI]大模型训练成本到底有多大?

大模型成本到底有多大&#xff0c;大到太平洋装不下。 上图是早前统计的&#xff0c;目前比较流行的大模型的厂家、模型名称、参数级别和类型。 大模型的成本主要有三块&#xff0c;分别是训练成本、推理成本、储存成本。 大模型的成本确实主要涉及训练成本、推理成本和储存成…

Python 包安装及常用命令【python 入门】

背景&#xff1a; 近期看到一个项目&#xff0c;做微信只能机器人&#xff0c;服务是使用python搭建的&#xff0c;于是拷贝下来自己打算跑一跑&#xff0c;部署一下&#xff0c;可是自己又没有python的经验&#xff0c;于是各种查资料学习&#xff0c;跟着敲一敲&#xff0c;顺…

Signac|成年小鼠大脑 单细胞ATAC分析(1)

引言 在本教程中&#xff0c;我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞&#xff08;PBMC&#xff09;的Signac入门教程中执行的命令。…

【机器学习】使用Stable Diffusion实现潜在空间搜索

1、引言 1.1 潜在空间的概念 潜在空间&#xff08;Latent Space&#xff09;是在机器学习和深度学习中一个重要的概念&#xff0c;它指的是用于表示数据的一种低维空间。这个空间编码了数据中包含的所有有用信息的压缩表示&#xff0c;通常比原始数据空间的维数更低&#xff…

java守护线程介绍

在Java中&#xff0c;守护线程&#xff08;Daemon Thread&#xff09;是一种特殊类型的线程&#xff0c;它在后台默默地运行&#xff0c;为其他线程提供服务。当 JVM 中只剩下守护线程时&#xff0c;JVM 会退出。这意味着&#xff0c;守护线程不应该执行关键的任务&#xff0c;…

COMPUTEX 2024 国际电脑展即将举行,英伟达宣布将Copilot+引入RTX系列设备,赋能游戏本AI助理

COMPUTEX 2024 国际电脑展即将于2024年6月4日至7日在台北南港展览馆1馆及2馆盛大举行。作为业界瞩目的盛会&#xff0c;本次展会不仅吸引了全球各地的科技爱好者&#xff0c;更迎来了AMD CEO苏姿丰博士和NVIDIA首席执行官黄仁勋的精彩演讲。 在展会的开幕之际&#xff0c;图形…

【Python】教你彻底了解Python中的模块和包

​​​​ 文章目录 一、模块的概念1. 导入模块2. 导入特定对象3. 给模块或对象取别名 二、标准库模块1. 常用标准库模块2. 使用示例 三、自定义模块1. 创建模块2. 使用自定义模块 四、包的结构与使用1. 创建包2. 使用包中的模块 五、包的深入使用1. 相对导入2. 子包3. 使用子包…