[C++11] 类中新特性的添加

默认的移动构造和移动赋值

在 C++11 之前,编译器会为每个类自动生成默认的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符等函数,以实现对象的创建、销毁和拷贝操作。但拷贝操作会复制整个对象的数据,效率低,尤其是在处理大对象或动态分配的资源时。为了解决这一问题,C++11 引入了移动语义(Move Semantics),并提供了两个新的默认函数:移动构造函数移动赋值运算符

移动构造和移动赋值运算符的作用是通过“转移”资源来代替“复制”资源,提高效率。它们通常用于避免不必要的拷贝操作,尤其是当资源的原有所有者不再需要保留这些资源时。

生成规则

  • 若类未定义析构函数、拷贝构造函数、拷贝赋值运算符或移动构造函数,编译器会自动生成默认的移动构造和移动赋值运算符。
  • 若类包含自定义析构函数、拷贝构造函数或拷贝赋值运算符,则编译器不会自动生成移动构造和移动赋值运算符,除非显式指定 =default

移动构造函数和移动赋值的行为

  • 内置类型成员将按字节逐一拷贝。
  • 自定义类型成员会优先调用它们的移动构造函数(若存在),否则调用拷贝构造函数。

也就是说,与其他的默认函数一样,自定义类型仍然需要看本身有没有实现相应的函数。

示例代码
#include <string>
#include <utility> // 包含std::moveclass Person {
public:Person(const char* name = "", int age = 0): _name(name), _age(age) {}// 移动构造函数自动生成,因为未定义拷贝构造或赋值函数private:std::string _name;int _age;
};int main() {Person p1("Alice", 25);Person p2 = std::move(p1); // 触发移动构造return 0;
}

在上述代码中,std::movep1 转换为右值引用(rvalue reference),指示编译器可以“转移”p1 的资源,而无需拷贝。p1 的数据会被移动到 p2,此操作避免了 p1 的拷贝过程。

注意

若类定义了移动构造函数或移动赋值运算符,编译器不会再自动生成拷贝构造函数和拷贝赋值运算符。

声明时给缺省值

在 C++11 之前,默认参数值只能在函数声明中给出,不能直接在成员变量定义时赋值。而 C++11 允许在类的成员变量声明时直接赋默认值,这一特性提高了代码的简洁性,并增强了初始化的灵活性。这样,在构造对象时,若未传入对应参数,成员变量会自动采用声明时指定的默认值。

示例代码

class Person {
public:Person(const char* name = "") : _name(name) {}private:std::string _name = "DefaultName"; // 直接在声明中赋缺省值int _age = 18; // 默认值为 18
};int main() {Person p; // _name 初始化为 "DefaultName",_age 初始化为 18return 0;
}

通过在声明时赋值,减少了构造函数中初始化的代码量,避免重复设置默认值,提高了可读性。

defaultdelete

C++11 引入了 =default=delete,提供更精细的控制:

  • =default:当类中定义了某个自定义函数(如拷贝构造),编译器不会自动生成移动构造函数。若希望保留自动生成的行为,可使用 =default 显式要求编译器生成该函数。
  • =delete:通过 =delete,可以禁用类的某些默认行为(如拷贝或赋值),例如禁用拷贝构造可以避免误用拷贝构造函数带来的资源分配问题。

示例代码:

class Person {
public:
Person(const char* name = "", int age = 0)
: _name(name), _age(age) {}Person(const Person& p) = delete; // 禁用拷贝构造函数
Person(Person&& p) = default;      // 显式要求生成默认移动构造函数private:
std::string _name;
int _age;
};int main() {Person s1("Alice", 25);// Person s2 = s1; // 错误:拷贝构造函数被禁用Person s3 = std::move(s1); // 调用默认的移动构造函数return 0;
}

finaloverride

在 C++ 的继承和多态中,派生类可能会误写或错写基类的虚函数,导致未按预期覆盖基类的行为。C++11 提供了 finaloverride 关键字,帮助开发者更好地控制和检测继承链中的函数覆盖行为。

  • override:用于修饰派生类中的虚函数,表示这是对基类中同名虚函数的覆盖。如果函数签名不匹配,编译器会报错。
  • final:用于修饰类或虚函数,表示该类或虚函数不允许被进一步继承或重写。
示例代码
class Base {
public:virtual void display() const {std::cout << "Base class display" << std::endl;}virtual void show() const final { // 不允许派生类重写此函数std::cout << "Base class show" << std::endl;}
};class Derived : public Base {
public:void display() const override { // 正确覆盖基类的displaystd::cout << "Derived class display" << std::endl;}// void show() const override; // 错误:不能重写final函数
};// class FurtherDerived : public Derived final {}; // 不允许进一步派生

override 关键字帮助避免虚函数重写错误,final 关键字则能阻止类或函数的进一步派生和重写,提升代码安全性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/10737.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…

用 Python 从零开始创建神经网络(三):添加层级(Adding Layers)

添加层级&#xff08;Adding Layers&#xff09; 引言1. Training Data2. Dense Layer Class 引言 我们构建的神经网络变得越来越受人尊敬&#xff0c;但目前我们只有一层。当神经网络具有两层或更多隐藏层时&#xff0c;它们变成了“深度”网络。目前我们只有一层&#xff0c…

ClickHouse 24.10 版本发布说明

本文字数&#xff1a;13817&#xff1b;估计阅读时间&#xff1a;35 分钟 作者&#xff1a;ClickHouse Team 本文在公众号【ClickHouseInc】首发 又到了新版本发布的时间&#xff01; 发布概要 本次ClickHouse 24.10 版本包含了25个新功能&#x1f381;、15项性能优化&#x1f…

AI4SCIENSE(鄂维南院士:再谈AI for Science)

鄂维南院士&#xff1a;再谈AI for Science_哔哩哔哩_bilibili 以往处理高维问题 量子力学&#xff1a;单变量乘积 统计学&#xff1a;旋转 AI4S 处理数据 蛋白质折叠&#xff1f; 不是纯粹的数据驱动 物理学等学科基本原理 例&#xff1a;分子动力学 数据模型 流程图 这…

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日&#xff0c;华为云全新上线Serverless应用中心&#xff0c;提供大量应用模板&#xff0c;帮助用户实现一键部署函数和周边依赖资源&#xff0c;节省部署时间&#xff0c;快速上手将应用部署到华为云函数工作流FunctionGraph&#xff0c;并一键开通周边依赖资源。 体验入口…

F5-TTS 整合包详细部署文档1110更新

F5-TTS 整合包详细部署文档&#xff1a;1110更新 F5-TTS 整合包详细部署教程1110更新 更新内容 本次更新加入了通义千问对话模型&#xff0c;以增强F5-TTS的功能和性能。 下载相关资源 F5-TTS文本转语音 链接&#xff1a;F5-TTS资源下载 文件列表 文件名大小说明01-主程序…

【bayes-Transformer-GRU多维时序预测】多变量输入模型。matlab代码,2023b及其以上

% 1. 数据准备 X_train 训练数据输入; Y_train 训练数据输出; X_test 测试数据输入; % 2. 模型构建 inputSize size(X_train, 2); numHiddenUnits 100; numResponses 1; layers [ … sequenceInputLayer(inputSize) biLSTMLayer(numHiddenUnits, ‘OutputMode’, ‘se…

AUTOSAR CP TCP/IP堆栈规范导读

一、规范的主要内容 该规范是AUTOSAR中关于TCP/IP堆栈的规范&#xff0c;主要内容包括以下几个方面&#xff1a; 总体介绍 功能概述&#xff1a;提供了发送和接收互联网协议数据的功能&#xff0c;位于Socket Adaptor和以太网接口模块之间。文档信息&#xff1a;包含文档标题…

redis安装

Redis的安装配置 安装Redis 安装gcc依赖 Redis是使用C语言编写的&#xff0c;Linux上并没有C语言的编译器&#xff0c;需要手动安装 yum install -y gcc tcl上传安装包并解压 将压缩包放在任意目录解压 tar -xzf redis-6.2.6.tar.gz安装 1.进入redis目录 cd redis-6.2.62.运行…

Linux系统程序设计--3. 文件操作

文件属性 存放文件属性的结构体 文件属性操操作函数 文件类型(7种) - 普通文件d目录p 管道文件l 符号链接(软链接) 判断文件类型的小程序 #include<sys/types.h> #include<sys/stat.h> #include<string.h> #include<stdio.h> #include<memory.h&…

单词反转和数组去重,附经典面试题一份

博彦科技笔试&#xff1a; 给定字符&#xff0c;拼接成单词进行反转单词&#xff1b; package org.example;public class Main {public static void main(String[] args) {char[] input {h, e, l, l, o, , w, o, r, l, d, , J, a, v, a};String inputToString new String(…

HTB:Precious[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 使用curl访问靶机80端口 使用ffuf爆破一下子域 使用浏览器访问该域名 使用curl访问该域名响应头 使用exiftool工具查看该pdf信息 横向移动 USER_FLAG&#xff1a;adf5793a876a190f0c08b3b6247cec32…

【2024.11.10实测有效:Win11右键默认显示更多设置教程】

winX 选择管理员 reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve# 再 taskkill /f /im explorer.exe & start explorer.exe! none taskkill /f /im explorer.exe; start explorer.exe

环形链表问题(图 + 证明 + 题)

文章目录 判断链表是否有环返回链表开始入环的第一个结点 判断链表是否有环 题目链接 思路&#xff1a; 可以明确的是&#xff1a;若一个链表带环&#xff0c;那么用指针一直顺着链表遍历&#xff0c;最终会回到某个地方。 我们可以定义两个指针&#xff08;快慢指针&#xf…

【优选算法 — 滑动窗口】最大连续1的个数 将 x 减到0的最小操作数

最大连续1的个数 最大连续1的个数 题目描述 题目解析 给我们一个元素全是0或者1的数组&#xff0c;和一个整数 k &#xff0c;然后让我们在数组选出最多的 k 个0&#xff1b;这里翻转最多 k 个0的意思&#xff0c;是翻转 0 的个数< k&#xff0c;而不是一定要翻转 k …

HTML基础

1.HTML基本结构标签 在Visual Studio Code中&#xff0c;使用&#xff01;回车就可以创建一个HTML的基本结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wi…

CSM快速匹配与多分辨率匹配代码实现

0. 简介 CSM在Cartographer中是比较基础且非常适合拓展的功能。他主要的步骤如下图。 主要实现的步骤为&#xff1a; 1&#xff09;获取先验位姿&#xff0c;通过TF获取里程计的值&#xff0c;作为当前scan的预测位姿&#xff0c;将这个预测位姿当做扫描匹配的先验。 2&…

力扣力扣力:动态规划入门(1)

相信大家在第一次学动态规划的时候都是一脸懵逼的&#xff0c;在看了很多题解之后&#xff0c;陷入到了空的“最优子结构”等的大词上&#xff0c;依旧看不懂动态规划到底在干什么。今天我们也是老样子再一次的从零开始学习与讲解&#xff0c;俺也是从零开始学动态规划&#xf…

私域流量时代下的新型商业模式:以开源链动 2 + 1 模式、AI 智能名片、S2B2C 商城小程序源码为例

摘要&#xff1a;本文探讨了私域流量时代的特点及其对商业盈利模式的影响。通过分析从大众消费时代到私域流量时代的转型&#xff0c;阐述了商品到“人”的变化过程。同时&#xff0c;深入研究了开源链动 2 1 模式、AI 智能名片和 S2B2C 商城小程序源码在私域流量发展中的作用…

多模态交互智能体全面解析:定义、架构、学习机制、系统实现、分类、应用场景及评估方法

多模态AI系统很可能会成为我们日常生活中无处不在的存在。使这些系统更具交互性的一种有希望的方法是将它们作为物理和虚拟环境中的智能体。目前&#xff0c;系统利用现有的基础模型作为创建具身智能体的基本构建块。将智能体嵌入这些环境中&#xff0c;有助于模型处理和解释视…