只谈C++11新特性 - 删除函数

删除函数

背景

在 C++11 之前,C++ 的类默认会生成拷贝构造函数和赋值运算符。这在某些情况下会引发问题,尤其是在我们希望明确禁止某些操作时。假设我们有一个类,它不希望被拷贝,但未明确声明拷贝构造函数和赋值运算符,这时编译器会自动生成默认实现,导致程序员可能无意间拷贝了该类对象,造成不可预期的行为或运行时错误。

示例

#include <iostream>

class NonCopyable {
public:
    NonCopyable() {}
    ~NonCopyable() {}
};

int main() {
    NonCopyable obj1;
    NonCopyable obj2 = obj1; // 未明确禁止拷贝,编译器生成默认的拷贝构造函数
    return 0;
}

上述代码中,NonCopyable 类没有声明拷贝构造函数,导致编译器生成了默认实现。而我们希望禁止对象的拷贝,却无法直接在编译时捕获这种问题。

常见的解决方案:将函数设为 private

在 C++11 之前,一个常见的解决方法是将不希望调用的拷贝构造函数和赋值运算符声明为 private,并且不提供实现。这样,尝试拷贝或赋值时会因访问权限问题导致编译错误。

#include <iostream>

class NonCopyable {
public:
    NonCopyable() {}
    ~NonCopyable() {}

private:
    NonCopyable(const NonCopyable&); // 声明为 private,禁止拷贝
    NonCopyable& operator=(const NonCopyable&); // 声明为 private,禁止赋值
};

int main() {
    NonCopyable obj1;
    // NonCopyable obj2 = obj1; // 编译错误:拷贝构造函数是 private 的
    // obj1 = obj2;            // 编译错误:赋值运算符是 private 的
    return 0;
}

虽然这种方式能够达到禁止拷贝和赋值的目的,但它的缺点在于代码不够直观,而且容易因未实现的函数导致链接错误。


新特性:删除函数

C++11 引入了“删除函数”(Deleted Functions)的概念,它允许开发者显式地声明某些函数为“已删除”,以禁止这些函数的调用。这一特性为类的设计提供了更精确的控制。

通过将函数声明为 = delete,编译器会在编译期检查是否存在对这些函数的调用,并在调用时产生编译错误。


删除函数的用途

禁止拷贝或赋值

通过删除拷贝构造函数和赋值运算符,可以明确禁止类的拷贝和赋值。

示例代码:禁止拷贝

#include <iostream>

class NonCopyable {
public:
    NonCopyable() {}
    ~NonCopyable() {}

    // 禁止拷贝构造
    NonCopyable(const NonCopyable&) = delete;

    // 禁止赋值运算
    NonCopyable& operator=(const NonCopyable&) = delete;
};

int main() {
    NonCopyable obj1;
    // NonCopyable obj2 = obj1; // 编译错误:调用已删除的拷贝构造函数
    // obj1 = obj2;            // 编译错误:调用已删除的赋值运算符
    return 0;
}

删除函数的优点

  1. 显式性:代码更清晰,开发者可以直接通过声明了解哪些操作被禁止。
  2. 安全性:在编译时检测不正确的调用,避免运行时错误。
  3. 可读性:比通过私有继承 boost::noncopyable 或声明私有拷贝构造函数的旧方式更直观。

总结

C++11 的删除函数为开发者提供了一种优雅且高效的方式来明确禁止特定操作,特别是在需要防止类的拷贝或赋值时。这一特性提升了代码的安全性和可读性,使得开发者能够更好地设计和维护复杂的 C++ 项目。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化

【HarmonyOS】鸿蒙arrayBuffer和Uint8Array互相转化 前言 ArrayBuffer ArrayBuffer内部包含一块Native内存&#xff0c;该ArrayBuffer的JS对象壳被分配在虚拟机本地堆&#xff08;LocalHeap&#xff09;。与普通对象一样&#xff0c;需要经过序列化与反序列化拷贝传递&#x…

Linux 搭建 nginx+keepalived 高可用 | Nginx反向代理

注意&#xff1a;本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用&#xff08;HA&#xff09; xyang0917 于 2016-09-17 00:24:15 发布 keepalived 的 HA 分为抢占模式和非抢占模式&#xff0c;抢占…

Cocos Creator 试玩广告开发 第二弹

上一篇的项目是2d的&#xff0c;现在谈谈对于3d试玩项目的一些经历。 相对于2d来说&#xff0c;3d的项目更接近于Unity的开发&#xff0c;但是也有很多不一样的地方&#xff0c;具体的也可以参考Cocos给他官方示例。 Unity 开发者入门 Cocos Creator 快速指南 | Cocos Creator…

输入框去掉角标

前言 正常情况下&#xff0c;HTML textarea 多行文本输入框会存如下图所示图标&#xff0c; 用户可拉动它改变高度&#xff0c;这是我们不想看到的&#xff0c;所以要去掉它。 去掉后&#xff1a; 解决方案 设置 resize 属性即可&#xff0c;如下代码所示&#xff1a; <…

ABAP实战案例-选择屏幕SUBSCREEN中搜索帮助失效的解决方法

案列背景&#xff1a; 选择屏幕作为SUBSCREEN时&#xff0c;搜索条件中的域值或者F4的搜索帮助会失效。 优化前示例与效果截图&#xff1a; * * SELECTION-SCREEN " 选择屏幕定义 *SELECTION-SCREEN BEGIN OF SCREEN 900 AS SUBSCREEN.SELECTION-SCREEN BEGIN OF BL…

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…

DDSort-简单实用的jQuery拖拽排序插件

DDSort.js是一款简单实用的jQuery拖拽排序插件。通过该插件你可以任意拖动页面中元素&#xff0c;并放置到指定的地方。DDSort.js插件实用简单&#xff0c;兼容IE8浏览器。 在线预览 下载 使用方法 实用该拖拽排序插件需要在页面中引入jquery文件和ddsort.js文件。 <scri…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包&#xff0c;该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具&#xff0c;是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

大表:适用于结构化数据的分布式存储系统

大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行&#xff08;Row&#xff09;2.2 Column Families&#xff08;列族&#xff09; 2.2.1 设计2.2.2 column key 的格式&#xff1a;family:qualifier2.2.3 访问控制和磁盘/内存记账&#xff08;acco…

【游戏设计原理】32 - 消费者剩余

1. 如何理解消费者剩余原理&#xff1f; 消费者剩余是一种经济学概念&#xff0c;表示消费者愿意为商品支付的最大金额与实际支付金额之间的差额。 简单来说&#xff0c;消费者剩余衡量了消费者从交易中获得的“额外价值”或“剩余利益”。 在传统商业模式下&#xff0c;由于…

sonarqube 安装及使用

一、官网参考地址 相关版本下载地址 配置全局变量 .bash_profileexport SONAR_HOME=/Users/jd/soft/sonar-scanner-6.2.1.4610 export PATH=$PATH:$SONAR_HOME/bin export SQ_HOST=http://127.0.0.1:9000/ export SQ_TOKEN=squ_dbb1913e095a92a727a918a9ba6b1af94b007748二、…

图研院 | 掌握前沿图技术,从 “Graph XAI” 课程起航

在如今数字化转型加速的时代浪潮下&#xff0c; 图数据库技术正成为众多领域突破创新的关键力量&#xff01; 你是否也渴望深入了解其背后的核心知识&#xff0c; 开启自己的图技术进阶之旅&#xff1f; 由机工社精心打造的系列大师课&#xff0c; 特邀国际级专家/学者师资…

在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档

软件下载地址: https://sourceforge.net/projects/pdfsam/files/ 需要注意事项&#xff0c;系统需要java环境&#xff0c;确认系统有java环境&#xff0c;根据软件版本需求安装对应的java运行环境。 下载pdfsam-4.3.4-linux.tar.gz安装包&#xff0c;解压&#xff0c;将runt…

PHP高性能webman管理系统EasyAdmin8

介绍 EasyAdmin8-webman 在 EasyAdmin 的基础上使用 webman 最新版重构&#xff0c;PHP 最低版本要求不低于 8.0。基于webman和layui v2.9.x的快速开发的后台管理系统。 项目地址&#xff1a;http://easyadmin8.top 演示地址&#xff1a;http://webman.easyadmin8.top/admin …

GitLab 将停止为中国区用户提供服务,60天迁移期如何应对? | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 GitLab作为一个广受欢迎的开源代码托管平台&#xff0c;近期宣布将停止服务中国大陆、澳门和香港地区的用户提供服务。根据官方通知&#x…

01.HTTPS的实现原理-HTTPS的概念

01.HTTPS的实现原理-HTTPS的概念 简介1. HTTPS的概念和安全性2. HTTPS的实现原理3. HTTPS和HTTP的区别4. OSI七层协议模型5. SSL和TLS的区别 简介 该系列文章主要讲述了HTTPS协议与HTTP协议的区别&#xff0c;以及HTTPS如何实现安全传输。内容分为三部分&#xff1a;HTTPS的实…

windows10下使用沙盒多开uiautoanimation可行性验证

文章目录 ⭐前言⭐sandboxie下载使用⭐pyinstaller打包python的uiautoanimation成exe⭐结论⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享windows下使用沙盒多开uiautoanimation可行性验证。 背景 实现多开应用程序从而进行自动化控制&#xff0c;批量处理大…

视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列&#xff0c;它可以用于…