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

编程实现三个数求最大

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

传参问题

直接使用返回值

复制控制

复制控制是指在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.mzph.cn/bicheng/34800.shtml

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

相关文章

mysql workbench使用schema视图导出表和列结构到excel

目的&#xff1a;导出所有表和列的名字和注释 很多时候没有正规的数据库文档&#xff0c;为了快速交流啊&#xff0c;需要一个快捷的基础。数据库建表的时候可能有注释&#xff0c;也可能没有注释。有当然好&#xff0c;查看注释就能清楚很多&#xff0c;没有的话最好一个一个补…

零基础如何制作一个GIS可视化大屏?免费无难度!

一.GIS是什么&#xff1f; GIS&#xff08;地理信息系统&#xff09;开发是一种利用计算机技术对地理信息进行处理、分析、存储和展示的技术。GIS开发可以应用在很多领域&#xff0c;如城市规划、环境保护、交通管理、农业生产等。 二.如何将GIS与数字孪生结合起来&#xff1f…

【面试题】多线程

目录 什么是线程&#xff1f;它与进程的区别是什么&#xff1f;解释一下并行与并发的区别。简述线程安全的概念&#xff0c;并举例说明。如何实现线程同步&#xff1f;有哪些常见的同步机制&#xff1f;在Java中&#xff0c;如何创建线程&#xff1f;谈谈继承Thread类与实现Run…

Verilog的逻辑系统及数据类型(二):参数和参数重载

目录 3.参数&#xff08;parameters)3.1 参数重载&#xff08;overriding)3.2 参数重载举例 微信公众号获取更多FPGA相关源码&#xff1a; 3.参数&#xff08;parameters) 用参数声明一个可变常量&#xff0c;常用于定义延时及宽度变量。参数定义的语法&#xff1a;paramete…

安卓应用开发学习:获取经纬度及地理位置描述信息

前段时间&#xff0c;我在学习鸿蒙应用开发的过程中&#xff0c;在鸿蒙系统的手机上实现了获取经纬度及地理位置描述信息&#xff08;鸿蒙应用开发学习&#xff1a;手机位置信息进阶&#xff0c;从经纬度数据获取地理位置描述信息&#xff09;。反而学习时间更长的安卓应用开发…

adb remount fails - mount: ‘system‘ not in /proc/mounts 解决办法

mount -o rw,remount /挂载根 mount -o ro,remount /将状态重置为“ro” 以下是我个人的一些话 我热衷于在网络上分享我遇到的问题和解决方案。如果你有任何问题或需要帮助&#xff0c;欢迎留言交流&#xff0c;在共同学习的道路上一起进步。我很高兴结识那些在学习上积极进取…

常用框架-Spring Boot

常用框架-Spring Boot 1、Spring Boot是什么?2、为什么要使用Spring Boot?3、Spring Boot的核心注解是哪个?它主要由哪几个注解组成的?4、有哪些运行Spring Boot的方式?5、如何理解 Spring Boot 中的Starters?6、有哪些常见的Starters?7、如何在Spring Boot启动的时候运…

【WEB】关于react的WEB应用中使用React Developer Tools便捷快速查看元素数据

1、往扩展工具中添加React Developer Tools的扩展包 2、检查是否生效&#xff0c;如下图&#xff1a; 可以看到右上角多出来一个Components的tab选项&#xff0c;就是成功了

数据校验(JSR303、SpringBoot、自定义注解)

在一个项目中&#xff0c;不仅前端要对用户输入的数据进行校验&#xff0c;避免发送不必要的请求&#xff0c;而且后端也要对数据进行对应的校验&#xff0c;因为操作不都是通过页面过来的。 前端 不是很了解 正则表达式 配合各种组件使用 后端 这里以Java为例&#xff0…

winform 限制TextBox中只能输入正整数

txt_n是文本框的名字 private void txt_n_KeyPress(object sender, KeyPressEventArgs e){if (e.KeyChar ! \b)//这是允许输入退格键 {int len txt_n.Text.Length;if (len < 1 && e.KeyChar 0){e.Handled true ;}else if ((e.KeyChar < 0) || (e.KeyChar >…

WebStorm 环境配置带@符号的相对路径穿透

在使用WebStorm 环境开发web页面项目时有时想快速查看页面的引用代码&#xff0c;只能手工找到引入文件路径&#xff0c;这很不方便&#xff0c;只需通过配置webStorm单击打开。 1 使用符号相对路径&#xff0c;在默认情况下没有配置环境是无法打开&#xff0c;如下图&#xf…

AI全栈之coze的logo生成

前言 前几日体验了国产的AI-Agents产品coze 它是一种能够自主执行任务、与环境进行交互并根据所获取的信息做出决策和采取行动的软件程序 并且可以自己去创建属于自己的AIBot&#xff0c;还是很有意思的&#xff0c;大家可以去体验体验 在体验过程中&#xff0c;我发现在创…

适合爬虫开发用的性价比高的代理推荐

在爬虫开发过程中&#xff0c;使用代理可以有效地隐藏爬虫的真实来源&#xff0c;并绕过一些可能对爬虫设置的限制。然而&#xff0c;市面上的代理服务众多&#xff0c;选择一款性价比高且适合爬虫开发的代理服务显得尤为重要。以下是一些适合爬虫开发用的性价比比较高的代理推…

Linux操作系统进程同步的几种方式及基本原理

1&#xff0c;进程同步的几种方式 1.1信号量 用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行&#xff1a;初始化&#xff0c;P操作和V操作&#xff0c;这三种操作都是原子操作。 P操作(递减操作)可以用于阻塞一个进程&#xff0c;V操作(增加操作)可以用于…

【华为OD机试】递增字符串(C++/Java/Python)

题目 题目描述 [定义字符串]完全由 ‘A’ 和 ‘B’组成,当然也可以全是’A’或全是’B’。如果字符串从前往后都是以字典序排列的,那么我们称之为严格递增字符串。 给出一个字符串s,允许修改字符串中的任意字符,即可以将任何的’A’修改成’B’,也可以将任何的’B’修改成…

Go 实现继承的方式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Java高级重点知识点-12-Collection、iterator迭代器、泛型

文章目录 Collection集合Iterator迭代器泛型&#xff08;难点&#xff09; Collection集合 集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合框架 单列集合java.util.Collection双列集合java.util.Map 集合类继承体系图&#xff1a; List集合的特点&am…

Interview preparation--Elasticsearch并发控制

Elasticsearch 并发控制 Elasticsearch是分布式的。创建&#xff0c;更新&#xff0c;删除文档时&#xff0c;必须将文档的新版本复制到集群中的其他节点。ES也是异步并行的&#xff0c;所有这些复制请求是并行发送的&#xff0c;并且可能不安顺序执行到每一个节点。ES需要一种…

新品发布 | TC1018Pro和TC1034Pro正式发布,功能升级,多设备时间同步

新品发布/New products release 同星智能最新推出TC1018Pro和TC1034Pro两款产品&#xff0c;新版本在保留原来基本功能的基础上做了升级&#xff0c;主要新增IO功能、错误帧ID检测、多设备间时间同步等功能。 接下来&#xff0c;让我们看看这两款产品带来了哪些具体功能升级&a…

玄奘取经线路矢量图分享

我们在《透过丝绸之路&#xff0c;看古人都走过哪些地方》一文中&#xff0c;为你分享过丝绸之路的矢量图数据。 现在&#xff0c;我们再为你分享一下玄奘取经线路的矢量图&#xff0c;你可以在文末查看这些数据的领取方式。 玄奘取经线路 《西游记》的故事相信大家都不陌生…