Move构造函数是C++中面向对象编程的一个重要特性,例如;复制赋值运算符构造函数、复制构造函数、移动赋值运算符、析构函数等。自C++11标准以来,在现代发展,move构造函数允许您将资源从一个对象移动到另一个对象,而无需复制它们。移动构造函数之一是隐式定义的Move构造函数它是在基类中定义或默认的,在本文中,我们将解释现代C++中什么是隐式定义的Move构造函数。
首先,让我们记住C++中的类和对象是什么。
现代C++中的类和对象是什么?
类是在C++中使用关键字定义的类
后跟类的名称。类是对象的蓝图。它们是用户定义的数据类型,我们可以在程序中使用,它们作为对象构造函数工作。对象是类的实例化。在C++编程中,大多数命令都与类和对象及其属性和方法相关联。下面是一个简单的类示例。
|
班 Tmyclass类 { 公众的: 标准::一串 字符串; }; |
然后我们可以用这个来创建对象T型的类型我的班级如下所示。
现在,让我们看看什么是move构造函数,
什么是现代C++中的移动构造函数?
移动构造函数是一个构造函数,允许您将资源从一个对象移动到另一个对象,而无需复制它们。换句话说,移动构造函数允许您从维瓦卢
对象转换为左值
对象。
move构造函数用于将一个对象的数据移动到新对象,它有效地生成一个指向旧对象成员的新指针,并将资源传输到堆内存。移动成员时,如果数据成员是指针,则还应将旧对象成员的值设置为NULL值。使用移动构造函数时,不会在内存中使用不必要的数据复制。这样可以更快地创建对象。大多数情况下,如果你的类/对象有一个移动构造函数,你可以使用C++其他功能的其他移动方法,例如,标准::矢量
,std::数组
,标准::映射
例如,可以使用类类型创建向量,然后可以使用推送(_back)
运行move构造函数的方法。
下面是C++中move构造函数最常用的语法(自C++11以来)。
此通用语法也是“移动构造函数的典型声明”的语法,如下所示。
|
类名称 ( 类名称 && ) //声明 { //定义 } //定义 |
在现代C++中,什么是隐式定义的移动构造函数?
The 隐式定义的Move构造函数是一个由另一个基隐式定义的移动构造函数,或者是一个既不删除也不重要的隐式声明的移动构造函数。
- 定义了隐式定义的Move构造函数,这意味着它具有由编译器隐式生成和编译的带有{}的函数体。
- 如果是类或结构类型,则隐式定义的移动构造函数对其成员执行完全移动操作。
- 隐式定义的移动构造函数复制对象表示(如std::memmove中所示)(如果它是联合类型)。
根据这篇论文作者:Bjarne Stroustrup,
- 默认情况下,如果每个元素都有一个移动构造函数,那么元素的聚合就有一个隐式定义的移动构造函数。
- 如果元素集合的任何元素都具有显式的移动构造函数,则隐式定义的元素集合的移动构造函数是显式的。类似地,对于复制构造函数
除此之外,
- 从C++11到C++20,如果隐式定义的移动构造函数满足constexpr构造函数的要求,那么它就是constexp构造函数。
- 自C++23以来,如果隐式定义的移动构造函数满足构造函数函数的要求,那么它就是constexpr。
现代C++中是否有一个隐式定义的移动构造函数的简单示例?
在现代C++示例中,这个简单的类示例默认使用move构造函数。
|
班 Tx(发送) { 公众的: 标准::一串 字符串 = “LearnCPlusPlus.org”; }; |
如下所示。
|
班 Tx(发送) { 公众的: 标准::一串 字符串 = “LearnCPlusPlus.org”; Tx(发送)() = 违约; //施工单位 Tx(发送)(Tx(发送)&& 其他) = 违约; //移动构造函数 }; |
我们可以定义自己的移动构造函数,如下所示:
|
班 Tx(发送) { 公众的: 标准::一串 字符串 = “LearnCPlusPlus.org”; Tx(发送)() = 违约; //施工单位 Tx(发送)(Tx(发送)&& 其他) //移动构造函数声明 { //移动构造函数定义 字符串 = 标准::移动(其他.字符串); //移动构造函数定义 } //移动构造函数定义 }; |
并且,我们可以使用这个Tx类作为基类来定义一个新的泰伊
分类如下。
|
班 泰伊 : 公众的 班 Tx(发送) //使用Tx作为基类 { 公众的: 空隙 打印_str(){ 标准::cout公司 << 字符串 << 标准::端部; } //此类具有来自Tx类的隐式定义的Move构造函数 }; |
正如你所见,这个新的泰伊
上面的类具有来自的隐式定义的移动构造函数Tx(发送)
类。因为它是隐式定义的,不是删除的,也不是琐碎的。
现代C++中有隐式定义的move构造函数的完整示例吗?
下面是一个使用基类中隐式定义的移动构造函数的完整示例。
1 2 三 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#包括<iostream> #包括<string> 班 Tx(发送) { 公众的: 标准::一串 字符串 = “LearnCPlusPlus.org”; Tx(发送)() = 违约; //施工单位 Tx(发送)(Tx(发送)&& 其他) //移动构造函数声明 { //移动构造函数定义 字符串 = 标准::移动(其他.字符串); //移动构造函数定义 } //移动构造函数定义 }; 班 泰伊 : 公众的 Tx(发送) //使用Tx作为基类 { 公众的: 空隙 打印str(){ 标准::cout公司 << 字符串 << 标准::端部; } //此类具有来自Tx类的隐式定义的移动构造函数 }; 整数 主要的() { 班 泰伊o1; 班 泰伊氧气 = 标准::移动(o1); //使用Tx中的隐式定义移动构造函数 o1.打印str(); 氧气.打印_str(); 系统(“暂停”); 返回 0; } |
下面是另一个带有模板类的隐式定义的move构造函数的完整示例。
1 2 三 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
#包括<iostream> #包括<string> 班 Tx(发送) { 公众的: 标准::一串 字符串 = “LearnCPlusPlus.org”; Tx(发送)() = 违约; //施工单位 Tx(发送)(Tx(发送)&& 其他) //移动构造函数声明 { //移动构造函数定义 字符串 = 标准::移动(其他.字符串); //移动构造函数定义 } //移动构造函数定义 }; 模板 <班 T型> 班 我的班级 { 公众的: T型 我的T; 空隙 打印str(){ 标准::cout公司 << 我的T.字符串 << 标准::端部; } //此模板具有来自类T的隐式定义的移动构造函数 }; 整数 主要的() { 我的班级<Tx(发送)> t1时间; 我的班级<Tx(发送)> 时间t2 = 标准::移动(t1时间); //使用模板中隐式定义的移动构造函数 t1时间.打印str(); 时间t2.打印_str(); 系统(“暂停”); 返回 0; } |
如果您需要有关移动构造函数的更多技术细节,请参阅本出版物中的Bjarne Stroustrup和Lawrence Crowlcan;https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3053.html
C++编译器是在Windows、MacOS、iOS和Android操作系统上构建简单或专业应用程序的最简单、最快的C和C++IDE。对于初学者来说,它也很容易学习,它有广泛的示例、教程、帮助文件和对代码的LSP支持。RAD Studio的C++Builder版本附带用于高性能本机Windows应用程序的屡获殊荣的VCL框架,以及用于跨平台UI的强大FireMonkey(FMX)框架。
有一个免费的C++Builder社区版,面向学生、初学者和初创公司;可以从以下网址下载在这里。对于专业开发人员,有professional、Architect或Enterprise版本。