C++中 ‘=default ’及‘ =delete ’的使用

yizhihongxing

C++中 "=default" 及 "=delete" 的使用

在 C++11 中,我们可以使用 "=default" 和 "=delete" 来精确地控制类的默认函数成员的生成情况,从而提高代码性能和可读性。下面将对 "=default" 和 "=delete" 的使用进行详细讲解。

"=default"

在 C++11 中,对于类的默认函数成员,可以使用 "=default" 来告知编译器生成标准的函数定义,这样做有助于提高编译器优化代码的能力。下面是使用 "=default" 关键字声明默认函数的方式:

class A {
public:
    A() = default;            // 默认构造函数
    A(const A&) = default;    // 拷贝构造函数
    A(A&&) = default;         // 移动构造函数
    A& operator=(const A&) = default;    // 赋值操作符
    A& operator=(A&&) = default;         // 移动操作符
    ~A() = default;           // 析构函数
};

如上代码所示,通过在函数定义后添加 "=default" 关键字,表示该函数的默认实现与编译器生成的标准实现相同。如果 "=default" 声明放在函数声明的后面,则该函数应被视为声明,而不是定义。

"=delete"

相反,C++11 也提供了 "=delete" 关键字,它允许我们显式地告知编译器不生成指定函数的默认实现。下面是 "=delete" 的使用示例:

class B {
public:
    B() = delete;             // 防止调用默认构造函数
    B(const B&) = delete;     // 防止调用拷贝构造函数
    B(B&&) = delete;          // 防止调用移动构造函数
    B& operator=(const B&) = delete;    // 防止调用赋值操作符
    B& operator=(B&&) = delete;         // 防止调用移动操作符
    ~B() = default;           // 默认析构函数
};

如上代码所示,通过在函数声明后添加 "=delete" 关键字,表示该函数应被视为被删除的函数。对于 "=delete" 声明适用的函数类型,编译器将不再为其生成默认实现。而且,如果尝试使用 "=delete" 函数,则编译器将会报错。

用法实例

  1. "=default" 的使用示例
class C {
public:
    C() = default;    // 生成标准默认构造函数
    C(int x) : val(x) {}    // 用户定义构造函数

private:
    int val;
};

int main()
{
    C a;          // 调用默认构造函数,编译器将生成该函数
    C b = a;      // 调用拷贝构造函数,编译器将生成该函数
    C c = std::move(a);     // 调用移动构造函数,编译器将生成该函数
    C d(10);     // 调用用户定义的构造函数
    return 0;
}

如上代码所示, "=default" 很容易地生成了默认函数成员。

  1. "=delete" 的使用示例
class D {
public:
    D() = default;           // 生成标准默认构造函数
    D(int x) : val(x) {}     // 用户定义构造函数
    D(const D&) = delete;    // 删除拷贝构造函数
    D& operator=(const D&) = delete;     // 删除赋值操作符

private:
    int val;
};

int main()
{
    // D a = b;     // 无法调用被删除的拷贝构造函数,编译器将报错
    // D c; c = b;  // 无法调用被删除的赋值操作符,编译器将报错
    return 0;
}

如上代码所示, "=delete" 能够有效地防止函数成员的误用和不必要的函数调用。

以上就是使用 "=default" 和 "=delete" 精细控制类默认函数成员的方法总结。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++中 ‘=default ’及‘ =delete ’的使用 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • 常用的压缩软件有哪些 五种常用压缩软件介绍

    常用的压缩软件有哪些 压缩软件是用于将文件或文件夹压缩成更小的文件,以便于存储和传输的工具。以下是五种常用的压缩软件的介绍: WinRAR:WinRAR 是一款功能强大的压缩软件,支持多种压缩格式,包括RAR、ZIP、7Z等。它具有高压缩比和快速压缩速度的特点,同时还支持加密和分卷压缩等功能。例如,你可以使用 WinRAR 压缩一个文件夹,并将其分成多个压缩…

    other 2023年7月28日
    00
  • python如何实现递归转非递归

    当一个算法或者函数使用递归时,它会在内存中伸展出一条递归链,最后达到解决问题的结束点,这条链往往是以下几个步骤的简单重复: 检查基本条件。 执行一些操作或者递归。 3. 更改输入参数。 递归可以使代码更加简洁和容易理解,但是递归链太长时,会消耗大量的内存资源,并且很难理清楚所有的递归过程,所以我们有必要将递归函数转换成非递归函数。 下面介绍两种将递归函数转化…

    other 2023年6月27日
    00
  • iOS应用开发中视图控件UIWindow的基本使用教程

    iOS应用开发中视图控件UIWindow的基本使用教程 1.什么是UIWindow 在iOS应用中,UIWindow是所有视图的容器,它是应用中最高级的视图。一般情况下,应用中只有一个UIWindow,而且这个UIWindow充满整个屏幕,我们可以把它看成是应用程序的“主窗口”。 2.UIWindow的基本用法 2.1 创建UIWindow 创建UIWind…

    other 2023年6月26日
    00
  • Word加载项为灰色的无法使用的解决方法

    问题描述:在使用Word时,如果加载项(Add-ins)的选项为灰色且无法选择,那么意味着该加载项无法使用。这时候,我们需要找到解决方法。 解决方法:以下为具体步骤: Step 1: 首先,我们需要判断是否存在Word的启动冲突。 – 示例:Word的启动冲突可能是由于与其他Office程序(如Outlook、Excel等)冲突所致。如果出现这种情况,可以尝…

    other 2023年6月25日
    00
  • sqlserver修改字段类型

    以下是SQL Server修改字段类型的攻略,包含两个示例: 示例1:使用ALTER TABLE语句修改字段类型 要使用ALTER TABLE语句修改字段类型,您可以按照以下步骤进行操作: 打开SQL Server Management Studio连接到您的数据库。 打开一个新的查询窗口并输入以下命令: ALTER TABLE table_name ALT…

    other 2023年5月6日
    00
  • 使用淘宝IP库获取用户ip地理位置

    使用淘宝IP库获取用户IP地理位置攻略 淘宝IP库是一个常用的工具,可以通过用户的IP地址获取其地理位置信息。下面是使用淘宝IP库获取用户IP地理位置的完整攻略。 步骤一:获取用户IP地址 首先,你需要获取用户的IP地址。在Web开发中,可以通过HTTP请求的头部信息中的X-Forwarded-For字段或者REMOTE_ADDR字段来获取用户的IP地址。具…

    other 2023年7月30日
    00
  • Linux下用于对比文件的diff命令使用教程

    Linux下用于对比文件的diff命令使用教程 diff命令是Linux下用于对比文件差异的工具。它可以比较两个文件的内容,并显示它们之间的不同之处。下面是diff命令的使用教程,包含两个示例说明。 基本语法 diff [选项] <文件1> <文件2> 选项说明 -q:仅显示文件是否不同,不显示具体差异内容。 -r:递归比较目录及其子…

    other 2023年8月18日
    00
  • laravel5.4生成验证码的代码

    生成验证码是许多 Web 应用的常见需求,在 Laravel 5.4 中也提供了相应的支持。 一、安装依赖 在开始前,需要安装 simple-qrcode 依赖,该依赖可以用于生成二维码。可以通过以下 composer 命令进行安装: composer require simplesoftwareio/simple-qrcode 二、生成验证码 1. 基本操…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部