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

编程实现三个数求最大

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

传参问题

直接使用返回值

复制控制

复制控制是指在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…

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

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

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

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

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

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

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

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

AI全栈之coze的logo生成

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

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

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

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…

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

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

玄奘取经线路矢量图分享

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

ABC234G Divide a Sequence 题解

题目来源 ABC234G 洛谷 Description 给定长度为 n n n 的序列 { a n } \{a_n\} {an​}。定义一种将 { a n } \{a_n\} {an​} 划分为若干段的方案的价值为每段的最大值减去最小值的差的乘积。求所有划分方案的价值的总和并对 998244353 998244353 998244353 取模。 1 ≤…

项目实训-vue(十一)

项目实训-vue&#xff08;十一&#xff09; 文章目录 项目实训-vue&#xff08;十一&#xff09;1.概述2.页顶导航栏3.导航信息4.总结 1.概述 本篇博客将记录我在图片上传页面中的工作。 2.页顶导航栏 <divstyle"display: flex;justify-content: space-between;alig…

如何挑选洗地机?盘点口碑最好的四大洗地机

在购买洗地机这种智能家电时&#xff0c;大家都应该格外谨慎。毕竟&#xff0c;洗地机价格不菲&#xff0c;精打细算&#xff0c;确保物尽其用才是最重要的。谁都不想花了高价买回来却让它闲置在墙角落灰尘。买之前我们还是需要对自己的需求做一个清晰的判断&#xff0c;实用性…

【unity笔记】六、UI实现下拉列表切换视角

具体步骤如下 1. 创建UI下拉列表&#xff1a; 在Unity场景中右键点击并选择UI -> 下拉列表 来创建一个新的下拉列表。 2. 添加摄像机选项&#xff1a; 在Dropdown的Options属性中添加新的选项&#xff0c;通过点击按钮来添加选项&#xff0c;并为每个选项设置一个显示名…

sourceTree 和Tortoise git软件的对比,以及使用sourceTree管理公司托管的 gitlab 项目或github项目

文章目录 Tortoisegit 和sourcetree的比较如何添加 gitlab 的社区版账号总结参考资料 Tortoisegit 和sourcetree的比较 我在 window都是用 Git 小乌龟&#xff08;Tortoise git&#xff09;来可视化管理 Git 项目。这时是不区分 Git 平台的&#xff0c;也就是不管你用的是 Git…

生产看板管理系统内容有哪些?

相信很多做生产管理的朋友都会遇到如下问题&#xff0c;我就在想&#xff0c;是否能一个创建“透明的”的工作场所&#xff1f;让员工和管理者能够实时查询生产进度&#xff0c;及时发现生产中的问题。 生产进度难追踪 生产过程不透明 生产决策缺乏数据支持 ——能&#xf…

ROS CDK魔法书:点亮博客上云新技能(TypeScript篇)

引言 在数字世界的浩瀚海洋中&#xff0c;信息与数据如同戏剧中的主角&#xff0c;舞动着无形的旋律&#xff0c;构建起信息时代的交响乐。而在这其中&#xff0c;作为一位技术领域的探索者&#xff0c;你的使命便是挥舞着编码的魔杖&#xff0c;创造和守护着这些宝贵的数字灵…

PointCloudLib 3D对象的可视化 C++版本

0.实现效果 显示箭头 vtkOutputWindow::SetGlobalWarningDisplay(0);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(1, 1, 1);//添加箭头显示pcl::PointXYZ pA(0, 0, 0);pcl:…