首页 > 其他分享 >笔记 -- 第十三章

笔记 -- 第十三章

时间:2025-01-22 17:33:18浏览次数:1  
标签:函数 右值 -- 笔记 对象 第十三章 拷贝 构造函数 赋值

第十三章 拷贝控制

拷贝控制操作(copy control):

  • 拷贝构造函数(copy constructor)
  • 拷贝赋值运算符(copy-assignment operator)
  • 移动构造函数(move constructor)
  • 移动赋值函数(move-assignement operator)
  • 析构函数(destructor)

拷贝、赋值和销毁

拷贝构造函数

  • 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数
  • class Foo { public : Foo (const Foo&);}
  • 合成的拷贝构造函数(synthesized copy constructor): 会将参数的成员逐个拷贝到正在创建的对象中。
  • 拷贝初始化
    • 将右侧运算对象拷贝到正在创建的对象中,如果需要,还需进行类型转换。
    • 通常使用拷贝构造函数完成。
    • string book = "9-99";
    • 出现场景:
      • =定义变量时。
      • 将一个对象作为实参传递给一个非引用类型的形参。
      • 从一个返回类型为非引用类型的函数返回一个对象。
      • 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员。

拷贝赋值运算符

  • 重载赋值运算符
    • 重写一个名为operator=的函数。
    • 通常返回一个指向其左侧运算对象的引用。
    • Foo& operator=(const Foo&);
  • 合成拷贝赋值运算符
    • 将右侧运算对象的每个非static成员赋予左侧运算对象的对应成员。

析构函数

  • 释放对象所使用的资源,并销毁对象的非static数据成员。
  • 名字由波浪号接类名构成。没有返回值,也不接受参数。
  • ~Foo();
  • 调用时机:
    • 变量在离开其作用域时。
    • 当一个对象被销毁时,其成员被销毁。
    • 容器被销毁时,其元素被销毁。
    • 动态分配的对象,当对指向它的指针应用delete运算符时。
    • 对于临时对象,当创建它的完整表达式结束时。
  • 合成析构函数:
    • 空函数体执行完后,成员会被自动销毁。
    • 注意:析构函数体本身并不直接销毁成员。

三/五法则

  • 需要析构函数的类也需要拷贝和赋值操作。
  • 需要拷贝操作的类也需要赋值操作,反之亦然。

使用=default

  • 可以通过将拷贝控制成员定义为=default来显式地要求编译器生成合成的版本。
  • 合成的函数将隐式地声明为内联的。

阻止拷贝

  • 大多数类应该定义默认构造函数、拷贝构造函数和拷贝赋值运算符,无论是隐式地还是显式地。
  • 定义删除的函数:=delete
  • 虽然声明了它们,但是不能以任何方式使用它们。
  • 析构函数不能是删除的成员。
  • 如果一个类有数据成员不能默认构造、拷贝、复制或者销毁,则对应的成员函数将被定义为删除的。
  • 老版本使用private声明来阻止拷贝。

拷贝控制和资源管理

  • 类的行为可以像一个值,也可以像一个指针。
    • 行为像值:对象有自己的状态,副本和原对象是完全独立的。
    • 行为像指针:共享状态,拷贝一个这种类的对象时,副本和原对象使用相同的底层数据。

交换操作

  • 管理资源的类通常还定义一个名为swap的函数。
  • 经常用于重排元素顺序的算法。
  • swap而不是std::swap

对象移动

  • 很多拷贝操作后,原对象会被销毁,因此引入移动操作可以大幅度提升性能。
  • 在新标准中,我们可以用容器保存不可拷贝的类型,只要它们可以被移动即可。
  • 标准库容器、stringshared_ptr类既可以支持移动也支持拷贝。IO类和unique_ptr类可以移动但不能拷贝。

右值引用

  • 新标准引入右值引用以支持移动操作。
  • 通过 && 获得右值引用。
  • 只能绑定到一个将要销毁的对象。
  • 常规引用可以称之为左值引用。
  • 左值持久,右值短暂。

move函数:

  • int &&rr2 = std::move(rr1);
  • move告诉编译器,我们有一个左值,但我希望像右值一样处理它。
  • 调用move意味着:除了对rr1赋值或者销毁它外,我们将不再使用它。

移动构造函数和移动赋值运算符

  • 移动构造函数:
    • 第一个参数是该类类型的一个引用,关键是,这个引用参数是一个右值引用
    • StrVec::StrVec(StrVec &&s) noexcept{}
    • 不分配任何新内存,只是接管给定的内存。
  • 移动赋值运算符:
    • StrVec& StrVec::operator=(StrVec && rhs) noexcept{}
  • 移动右值,拷贝左值。
  • 如果没有移动构造函数,右值也被拷贝。
  • 更新三/五法则:如果一个类定义了任何一个拷贝操作,它就应该定义所有五个操作。
  • 移动迭代器:
    • make_move_iterator函数讲一个普通迭代器转换为一个移动迭代器。
  • 建议:小心地使用移动操作,以获得性能提升。

右值引用和成员函数

  • 区分移动和拷贝的重载函数通常有一个版本接受一个const T&,而另一个版本接受一个T&&
  • 引用限定符:
    • 在参数列表后面防止一个&,限定只能向可修改的左值赋值而不能向右值赋值。

标签:函数,右值,--,笔记,对象,第十三章,拷贝,构造函数,赋值
From: https://www.cnblogs.com/sys-123456/p/18686486

相关文章

  • Pod的重启策略
    KubernetesPod的重启策略在Kubernetes(简称K8s)中,Pod的重启策略(RestartPolicy)决定了当容器失败时,kubelet应该如何处理容器的重启行为。重启策略主要由spec.restartPolicy字段定义,并适用于整个Pod中的所有容器。Kubernetes支持以下三种主要的重启策略:1.Always(默认策略......
  • 规划方向
    语文背诵:背诵古诗文背诵文言文实词数学背诵:背诵概念英语背诵:背诵单词背诵语法政治背诵:背诵知识点历史背诵:背诵知识点地理背诵:背诵知识点生物背诵:背诵知识点语文补充:需要关注相关答题模版,学会如何答题,如何拿高分,多看优秀作文,积累好词好句,填充单一形式数学补充:需要多练习......
  • [lnsyoj2594/luoguP2763] 试题库问题
    题意假设一个试题库中有\(n\)道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性,但在试卷中只计一种。从题库中抽取\(m\)道题组成试卷,使试卷包含第\(i\)种试题\(a_i\)道,共需\(k\)道。sol建立二分图模型,使左侧点对应试题,右侧点对应类别。每一个左侧点向......
  • 如何快速下载Huggingface上的超大模型,不用梯子,以Deepseek-R1为例子
    就在昨天DeepSeek-R1模型问世即爆火,37B的大模型,你想部署一下试试吗?我就想试试,毕竟本人有8卡A100可以玩。首先我们需要从Huggingface下载模型权重,我在国内,文件太大了,下载不了。有方法,有教程,请仔细看。模型地址:https://huggingface.co/deepseek-ai/DeepSeek-R1/tree/main  ......
  • rules
    Background从前有个荣光的王国,小A是其中的国王,他认为一个国家除了法律外还要有一些约定俗成的规则,所以今天他要赐以其规则。Description小A制定了一些规则,每条规则有一个代号,代号为不超过 109109 的非负整数。小A的国家有 n 位居民,每位居民每天会且仅会遵守 1 ......
  • 小智带货助手如何制作视频素材教程
    要想生成质量较好的视频,素材是必不可的。素材画面和文案内容的相关贴合度,会直接影响到平台对视频质量的判定,也会影响用户的观看体验。比如,视频文案是讲的情感鸡汤,视频素材画面却是某个喜剧影视片段或者其他毫无相关的,那么这样的视频必定难以获得流量;而如果素材画面是比较孤独的......
  • 基于java web的社区人员流动管理系统的设计与实现-毕业设计源码19467
    目 录1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3系统用例分析2.4系......
  • springboot 社区留守儿童管理系统的设计与实现-毕业设计源码19573
    目 录摘要1绪论1.1系统的选题背景与意义1.2研究内容1.3论文结构与章节安排2 社区留守儿童管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析......
  • 【C++BFS算法】1210. 穿过迷宫的最少移动次数|2022
    本文涉及知识点C++BFS算法LeetCode1210.穿过迷宫的最少移动次数你还记得那条风靡全球的贪吃蛇吗?我们在一个n*n的网格上构建了新的迷宫地图,蛇的长度为2,也就是说它会占去两个单元格。蛇会从左上角((0,0)和(0,1))开始移动。我们用0表示空单元格,用1表示障碍物。蛇......
  • 分享一款WebSocket在线测试工具,使用简单方便
    ​WebSocket作为一种高效的双向通信技术,广泛应用于实时数据传输、在线游戏、金融交易等领域。然而,对于开发者和测试人员来说,确保WebSocket连接的稳定性和性能至关重要。这就是为什么我们需要一款可靠的WebSocket在线测试工具。今天,就让我们一起探索一款强大且便捷的工具——3M万能......