第二天的课根本跟不上啊 难难难啊

news2024/12/28 22:58:10

编程实现三个数求最大

编程实现求解一元二次方程

传参问题

直接使用返回值

复制控制

复制控制是指在C++中控制对象复制行为的机制,

包括拷贝构造函数(copy constructor)、

赋值操作符(copy assignment operator)、

移动构造函数(move constructor)

和移动赋值操作符(move assignment operator)。

通过这些函数,可以控制对象在复制、赋值和移动时的具体行为,

确保资源的正确管理和高效操作。

### 复制控制函数的种类

1. **拷贝构造函数**:
   - 当创建一个对象作为另一个对象的副本时,调用拷贝构造函数。
   - 语法:`ClassName(const ClassName &other);`

2. **赋值操作符**:
   - 当一个已存在的对象被赋值为另一个对象时,调用赋值操作符。
   - 语法:`ClassName& operator=(const ClassName &other);`

3. **移动构造函数**:
   - 当一个对象被移动构造到另一个对象时(通常是从一个临时对象),调用移动构造函数。
   - 语法:`ClassName(ClassName &&other) noexcept;`

4. **移动赋值操作符**:
   - 当一个已存在的对象被移动赋值为另一个对象时,调用移动赋值操作符。
   - 语法:`ClassName& operator=(ClassName &&other) noexcept;`

### 具体示例

让我们创建一个简单的类 `MyClass` 来展示这些复制控制函数:

```cpp
#include <iostream>
#include <cstring>

class MyClass {
private:
    char* data;

public:
    // 默认构造函数
    MyClass() : data(nullptr) {
        std::cout << "默认构造函数" << std::endl;
    }

    // 带参数的构造函数
    MyClass(const char* str) {
        std::cout << "带参数的构造函数" << std::endl;
        data = new char[strlen(str) + 1];
        strcpy(data, str);
    }

    // 拷贝构造函数
    MyClass(const MyClass &other) {
        std::cout << "拷贝构造函数" << std::endl;
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
    }

    // 赋值操作符
    MyClass& operator=(const MyClass &other) {
        std::cout << "赋值操作符" << std::endl;
        if (this == &other) return *this; // 防止自赋值
        delete[] data;
        data = new char[strlen(other.data) + 1];
        strcpy(data, other.data);
        return *this;
    }

    // 移动构造函数
    MyClass(MyClass &&other) noexcept {
        std::cout << "移动构造函数" << std::endl;
        data = other.data;
        other.data = nullptr; // 防止原对象释放资源
    }

    // 移动赋值操作符
    MyClass& operator=(MyClass &&other) noexcept {
        std::cout << "移动赋值操作符" << std::endl;
        if (this == &other) return *this; // 防止自赋值
        delete[] data;
        data = other.data;
        other.data = nullptr; // 防止原对象释放资源
        return *this;
    }

    // 析构函数
    ~MyClass() {
        std::cout << "析构函数" << std::endl;
        delete[] data;
    }

    // 打印数据
    void print() const {
        if (data) {
            std::cout << "数据: " << data << std::endl;
        } else {
            std::cout << "数据为空" << std::endl;
        }
    }
};

int main() {
    MyClass obj1("Hello");
    MyClass obj2 = obj1; // 拷贝构造
    MyClass obj3;
    obj3 = obj1; // 赋值操作

    MyClass obj4 = MyClass("World"); // 移动构造
    MyClass obj5;
    obj5 = MyClass("Move"); // 移动赋值

    obj1.print();
    obj2.print();
    obj3.print();
    obj4.print();
    obj5.print();

    return 0;
}
```

### 解释和如何使用

1. **拷贝构造函数**:
   - 在 `MyClass obj2 = obj1;` 语句中调用。创建一个新对象 `obj2`,并用 `obj1` 的数据初始化它。
   - 拷贝构造函数确保对象 `obj2` 获得自己的资源副本。

2. **赋值操作符**:
   - 在 `obj3 = obj1;` 语句中调用。将现有对象 `obj3` 的数据替换为 `obj1` 的数据。
   - 赋值操作符需要处理自赋值情况(`if (this == &other) return *this;`),并在赋值前释放现有的资源(`delete[] data;`)。

3. **移动构造函数**:
   - 在 `MyClass obj4 = MyClass("World");` 语句中调用。将临时对象的资源移动到 `obj4`,而不是复制。
   - 移动构造函数将临时对象的资源转移到新对象,并将临时对象的资源指针置为空,防止资源被释放两次。

4. **移动赋值操作符**:
   - 在 `obj5 = MyClass("Move");` 语句中调用。将临时对象的资源移动到 `obj5`,而不是复制。
   - 移动赋值操作符类似于移动构造函数,但需要释放现有对象的资源,并处理自赋值情况。

### 总结

- **复制控制**使得我们可以精确控制对象在复制、赋值和移动时的行为,确保资源正确管理和高效操作。
- **拷贝构造函数**和**赋值操作符**用于复制对象,确保每个对象都有自己的资源副本。
- **移动构造函数**和**移动赋值操作符**用于移动对象,转移资源所有权以避免不必要的复制,提高性能。
- 使用这些函数时,需要特别注意资源管理,防止内存泄漏和资源重复释放。

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

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

相关文章

Win10可用的VC6.0绿色版及辅助插件assist_X

VC6.0&#xff0c;作为微软的经典开发工具&#xff0c;承载着无数开发者的青春与回忆。它曾是Windows平台上软件开发的重要基石&#xff0c;为开发者们提供了稳定且强大的编程环境&#xff0c;尤其是其MFC&#xff08;Microsoft Foundation Classes&#xff09;库&#xff0c;为…

STM32HAL库--DMA实验(速记版)

本章利用 DMA 来实现串口数据传送&#xff0c;并在LCD 模块上显示当前的传送进度。 DMA 简介 DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场…

微服务中不同服务使用openfeign 相互调用

首先 我们上文 已经知道了 nacos 的注册服务&#xff0c;现在 我们 在不同服务中相互调用就可以使用openfeign 直接调用&#xff0c;而不是 再写冗余的调用代码啦 首先 我们的微服务组件如下 因为我这个微服务是我在 员工登录demo 中 拆出来的&#xff0c;在userlogin模块中…

2024年不可错过的12个Web程序设计语言!

Web开发行业出现以来&#xff0c;通过各种形式和渠道不断发展壮大。随着5g时代的到来&#xff0c;Web开发在移动互联网领域不断出现新的开发场景&#xff0c;也是最受欢迎的技能之一。掌握Web程序设计语言是在Web开发领域大放异彩的必要条件之一。接下来&#xff0c;即时设计选…

[论文笔记]Mixture-of-Agents Enhances Large Language Model Capabilities

引言 今天带来一篇多智能体的论文笔记&#xff0c;Mixture-of-Agents Enhances Large Language Model Capabilities。 随着LLMs数量的增加&#xff0c;如何利用多个LLMs的集体专业知识是一个令人兴奋的开放方向。为了实现这个目标&#xff0c;作者提出了一种新的方法&#xf…

DCT-Net - 一键图片、视频转卡通动漫风格工具,本地一键整合包下载

只需要输入一张人物图像或者一段视频&#xff0c;就可以实现端到端全图卡、视频通化转换&#xff0c;生成二次元虚拟形象&#xff0c;返回卡通化后的结果图像或视频。 开发者叫menyi Fang&#xff0c;来自阿里巴巴通义实验室的的技术女大佬&#xff0c;国内大佬集成到webui&am…

mprpc框架的配置文件加载

目录 1.回顾测试 2.mprpc框架的配置文件加载 2.1 mprpcconfig.h 2.2 完善mprpcapplication.h 2.3 完善mprpcapplication.cc 2.4 mprpcconfig.cc 2.5 test.conf 2.6 测试运行 ​3.扩展问题 1.回顾测试 我们先把之前的项目代码工程编译好&#xff0c;然后进入bin里面&am…

用VScode打开keil下的文件中文编码乱码的问题,以及利用VScode转换字符编码的方法

目录 问题描述 解决方法 利用VScode转换字符编码的方法 问题描述 keil中默认的编码是ANIS如下图所示。 而VScode中默认的编码为UTF-8 &#xff0c;打开后如下。 解决方法 建议另存后&#xff0c;再打开目标文件&#xff0c;防止误操作&#xff01; 在VScode的最下方可以找…

计算预卷积特征

当冻结卷积层和训练模型时&#xff0c;全连接层或dense层(vgg.classifier)的输入始终是相同的。为了更好地理解&#xff0c;让我们将卷积块(在示例中为vgg.features块)视为具有了已学习好的权重且在训练期间不会更改的函数。因此&#xff0c;计算卷积特征并保存下来将有助于我们…

2024年上半年软件设计师上午真题及答案解析

1.在计算机网络协议五层体系结构中&#xff0c;( B )工作在数据链路层。 A.路由器 B.以太网交换机 C.防火墙 D.集线器 网络层&#xff1a;路由器、防火墙 数据链路层&#xff1a;交换机、网桥 物理层&#xff1a;中继器、集线器 2.软件交付之后&#xff…

引领AI新时代:深度学习与大模型的关键技术

文章目录 &#x1f4d1;前言一、内容概述二、作者简介三、书籍特色四、学习平台与资源 &#x1f4d1;前言 在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;和深度学习技术已经渗透到我们生活的方方面面。从智能手机中的智能语音助手&#xff0c;到…

音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析

一、引言 FFmpeg源码中 通过h264_parse_nal_header函数将H.264码流的NALU Header解析出来。下面对h264_parse_nal_header函数进行分析。 二、h264_parse_nal_header函数定义 h264_parse_nal_header函数定义在FFmpeg源码&#xff08;下面演示的FFmpeg源码版本是5.0.3&#xff…

阅读笔记——《Large Language Model guided Protocol Fuzzing》

【参考文献】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.&#xff08;CCF A类会议&#xff09;【注】本文仅为作者个人学习笔记&a…

Geoserver源码解读四 REST服务

文章目录 文章目录 一、概要 二、前置知识点-FreeMarker 三、前置知识点-AbstractHttpMessageConverter 3.1 描述 3.2 应用 四、前置知识点-AbstractDecorator 4.1描述 4.2 应用 五、工作空间查询解读 5.1 模板解读 5.2 请求转换器解读 一、概要 关于geoserver的r…

2024最新算法:北极海鹦优化(Arctic puffin optimization,APO)算法求解23个函数,MATLAB代码

一、算法介绍 北极海鹦优化&#xff08;Arctic puffin optimization&#xff0c;APO&#xff09;算法是2024年提出一种智能优化算法。该算法模拟海鹦在空中飞行和水下觅食两个阶段的行为&#xff0c;旨在实现勘探与开发之间更好的平衡。该算法包括几个关键操作&#xff0c;包括…

Nginx开发【Nginx虚拟主机和域名解析】

03 【Nginx虚拟主机和域名解析】 虚拟主机使用特殊的软硬件技术&#xff0c;把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机&#xff0c;每一台虚拟主机都具有独立的域名&#xff0c;具有完整的Internet服务器&#xff08;WWW、FTP、Email等&#xff09;功能&…

FFmpeg+javacpp+javacv使用

FFmpegjavacppjavacv使用 Bytedeco官网案例1、导入opencv、ffmpeg依赖包2、FFmpeg 数据结构2.1 AVFormatContext 格式化I/O上下文2.1.1 metadata2.1.2 Duration、start、bitrate等其他信息2.1.3 dump信息 Bytedeco GitHub&#xff1a;javacpp Bytedeco官网案例 FFmpeg – [示例…

C语言·动态内存管理

1. 为什么要有动态内存管理&#xff1f; 例1&#xff1a; //固定的向内存申请4个字节 int a 10;//申请连续的一块空间 int arr[10]; 这些数据一旦声明定义之后就会在内存中有一块空间&#xff0c;这些空间都是固定的&#xff0c;为了让内存使用更加灵活&#xff0c;这时我们…

【回溯算法题记录】组合总和题汇总

组合总和 39. 组合总和题目描述初始思路后续分析 40. 组合总和 II题目描述思路&#xff08;参考代码随想录&#xff09; 39. 组合总和 题目&#x1f517; 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数…