首页 > 编程语言 >C++ 3/5 法则相关

C++ 3/5 法则相关

时间:2024-09-15 12:13:05浏览次数:11  
标签:初始化 销毁 法则 参见 对象 C++ 相关 拷贝 构造函数

拷贝构造函数

拷贝构造函数的第一个参数必须是一个引用类型。虽然我们可以定义一个接受非 const 引用的拷贝构造函数,但此参数几乎总是一个 const 的引用
拷贝构造函数在几种情况下都会被隐式地使用。因此,拷贝构造函数通常不应该是explicit的(参见 7.5.4节,第 265 页)。

一般情况,合成的拷贝构造函数将其参数的成员逐个拷贝到正在创建的对象中(参见 7.1.5节,第 239 页)。编译器从给定对象中依次将每个非static成员拷贝到正在创建的对象中。

虽然我们不能直接拷贝一个数组(参见 3.5.1节,第 102页),但合成拷贝构造函数会逐元素地拷贝一个数组类型的成员。如果数组元素是类类型,则使用元素的拷贝构造函数来进行拷贝。

拷贝初始化通常使用拷贝构造函数来完成。但是,如我们将在13.6.2节(第473页)见,如果一个类有一个移动构造函数,则拷贝初始化有时会使用移动构造函数而非拷贝造函数来完成。
但现在,我们只需了解拷贝初始化何时发生,以及拷贝初始化是依靠拷构造函数或移动构造函数来完成的就可以了。

拷贝初始化不仅在我们用=定义变量时会发生,在下列情况下也会发生

  • 将一个对象作为实参传递给一个非引用类型的形参
  • 从一个返回类型为非引用类型的函数返回一个对象
  • 用花括号列表初始化一个数组中的元素或一个聚合类中的成员(参见7.5.5节,第266 页)

某些类类型还会对它们所分配的对象使用拷贝初始化。例如,当我们初始化标准库容器或是调用其 insert 或 push 成员(参见 9.3.1 节,第 306 页)时,容器会对其元素进行拷贝初始化。
与之相对,用 emplace 成员创建的元素都进行直接初始化(参见9.3.1节,第308 页)。

--《C++ Primer》 p441

析构函数

合成的规则和拷贝构造函数比较类似。

什么时候会调用析构函数

无论何时一个对象被销毁,就会自动调用其析构函数:

  • 变量在离开其作用域时被销毁。
  • 当一个对象被销毁时,其成员被销毁。
  • 容器(无论是标准库容器还是数组)被销毁时,其元素被销毁。
  • 对于动态分配的对象,当对指向它的指针应用删除运算符时被销毁(参见12.1.2节,第409页)。
  • 对于临时对象,当创建它的完整表达式结束时被销毁。

--《C++ Primer》 p445

标签:初始化,销毁,法则,参见,对象,C++,相关,拷贝,构造函数
From: https://www.cnblogs.com/huvjie/p/18399669

相关文章

  • C++ Primer Plus 第六版中文版(上)
    参考资料:《C++PrimerPlus第六版中文版》笔记作者:Mr.Crocodile欢迎转载文章目录开始学习C++头文件命名规定名称空间`cout`、`cin`函数处理数据简单变量变量命名规则整型运算符`sizeof`和头文件climitsclimits中的符号常量变量初始化整型字面量整型字面量后缀char......
  • C++编译器的那些事
    接上文OK!Rightnow!  Let's go!C++编译器是如何工作的?C++编译器实际负责什么?我们把C++代码写成文本。就是这样,他只是一个文本文件,然后我们需要一些将文本转换为实际应用程序的方法,我们的计算机可以运行。从文本形式到实际可执行的二进制文件,我们基本上有两个主要......
  • 哈?Dev C++ 支持代码智能补全啦?
    众所周不知,我是一名VS的用户,其实也用过其他的很多的C++编译器。印象最深的,还是DevC++。因为它是以一个个的.cpp文件为单位,可以直接编译运行,非常舒畅,不像VS那样,是以一个个项目为单位。而直到有一次,我原先安装的DevC++被我搞坏了,于是在本地存的一个安装包中随便找了一个......
  • 链表的快速排序(C/C++实现)
    一、前言大家在做需要排名的项目的时候,需要把各种数据从高到低排序。如果用的快速排序的话,处理数组是十分简单的。因为数组的存储空间的连续的,可以通过下标就可以简单的实现。但如果是链表的话,内存地址是随机分配的,不能像数组那样通过下标就直接实现。所以在这里给大家介绍......
  • 南沙C++信奥老师解一本通题: 1361:产生数(Produce)
    ​ [题目描述】给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:①1个数字可以变换成另1个数字;②规则中,右边的数字不能为零。例如:n=234,k=2规则为2→53→6上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。求经过任意次的变换(0次......
  • C++ 派生类赋值运算符应显示调用
    structBase{doublex{111.1};};structDerive:publicBase{doubley{222.2};Derive&operator=(constDerive&obj){if(&obj==this){return*this;}Base::operator=(obj);/......
  • CTF比赛中的Git相关题目解题思路
    在CTF比赛中,涉及Git相关的题目通常会考察参赛者对Git仓库的了解,尤其是如何利用公开或不完整的Git仓库来恢复源代码或获取敏感信息。本文将结合一些常见的工具和步骤,详细介绍如何解决这类题目。背景Git是一种分布式版本控制系统,通常用于管理源代码。在某些情况下,Web服务器......
  • VSCode 配置 C/C++ 开发环境的终极指南
    在现代软件开发中,VisualStudioCode(VSCode)因其轻量级、可扩展性和强大的功能而受到广泛欢迎。对于C/C++开发者来说,配置一个高效的开发环境是至关重要的。本文将详细介绍如何在VSCode中配置C/C++开发环境,帮助你快速上手并提高开发效率。一、安装VSCode首先,你需要在你......
  • c++中的继承和多态
    目录 Linux中的管道通信​编辑派生类的默认成员函数继承  派生类的构造 隐藏如何设计一个不能被继承的类菱形继承virtualvirtual是如何解决的内存对象模型继承和组合继承组合多态概念多态的构成条件虚函数的重写Linux中的管道通信派生类的默认成员函......
  • Linux相关命令的使用
    一、压缩和归档的命令1.1压缩和解压缩操作对象是单个文件压缩方式:gzip--->.gzbzip--->.bz2xz--->.xz上是三种压缩方式:压缩率依次递减,压缩速率依次递减。gzipfile//将文件file按gzip格式进行压缩//压缩之后原文件就不存在了,只留下名为file.gz的压缩后......