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

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" 精细控制类默认函数成员的方法总结。

阅读剩余 47%

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

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

相关文章

  • Android TextView自定义数字滚动动画

    Android TextView自定义数字滚动动画攻略 在Android开发中,我们可以使用自定义动画来实现数字滚动效果。下面是一个详细的攻略,包含两个示例说明。 步骤一:创建动画资源文件 首先,我们需要创建一个动画资源文件来定义数字滚动的动画效果。在res目录下的anim文件夹中创建一个名为number_scroll.xml的文件,并添加以下内容: &lt…

    other 2023年9月5日
    00
  • PPT2010提示控件出错怎么禁用控件?

    要禁用PPT2010的提示控件,可以按照以下步骤操作: 1. 打开PowerPoint选项 在PowerPoint中,点击“文件” -> “选项”菜单,打开PowerPoint选项对话框。 2. 进入信任中心设置 在PowerPoint选项对话框中,点击左侧菜单栏中的“信任中心”,然后再点击右侧窗口中的“信任中心设置”按钮。 3. 禁用宏警告和Acti…

    other 2023年6月27日
    00
  • 装系统32位好还是64位好 32位和64位系统区别对比

    装系统32位好还是64位好?32位和64位系统区别对比 介绍 在选择操作系统时,一个重要的考虑因素是选择32位还是64位系统。本攻略将详细讲解32位和64位系统的区别,并提供两个示例说明。 32位系统 32位系统是指操作系统在处理器上使用32位寻址空间的系统。以下是32位系统的特点: 内存限制:32位系统最大支持4GB的内存地址空间。这意味着无论计算机有多少…

    other 2023年7月28日
    00
  • Principal components analysis(PCA):主元分析

    Principal components analysis(PCA):主元分析 简介 主元分析(Principal components analysis, PCA)是一种广泛应用于数据探索和预测建模的线性降维方法。通过将高维数据映射到低维空间中,PCA能够帮助我们理解数据的结构,减少数据中的噪声以及提高学习算法的效率。 在实际应用中,PCA可以用于许多领域…

    其他 2023年3月28日
    00
  • idea 实现纵列选择和大小写转换操作

    实现纵列选择和大小写转换操作攻略 1. 纵列选择操作 纵列选择操作是指从一个文本中选择指定列的内容。下面是实现纵列选择操作的步骤: 将文本按行分割成一个列表,每行作为列表的一个元素。 遍历列表中的每一行,将每行按照指定的分隔符进行分割,得到一个包含各列内容的子列表。 根据指定的列号,选择对应的列内容,并将其存储到一个新的列表中。 返回新的列表作为纵列选择操作…

    other 2023年8月17日
    00
  • 苹果手表长期不充电开不了机怎么办 Apple Watch闲置太久充电没反应的解决办法

    苹果手表长期不充电开不了机怎么办 苹果手表在长期不充电的情况下可能会变得没有电量,无法开机。本文将介绍您苹果手表无法开机的情况以及解决方法。 检查电量 首先需要检查苹果手表的电量,因为在电量过低的情况下手表是无法开机的。当然,由于设备长时间没有充电可能导致电量非常低,此时需要使用充电器将其充电。若手表显示的电量过低,需先让其充满电然后再进行开机操作。 强制重…

    other 2023年6月27日
    00
  • miniprofiler工具

    以下是“MiniProfiler工具”的完整攻略: MiniProfiler工具 MiniProfiler是一款开源的性能分析工具,可以用于测量ASP.NET应用程序的性能。以下使用MiniProfiler的步骤: 安装MiniProfiler。 在使用MiniProfiler之前,您需要将其安装到您的ASP.NET应用程序中。您可以使用NuGet包管理器来…

    other 2023年5月7日
    00
  • MyBatis一对多嵌套查询的完整实例

    MyBatis一对多嵌套查询的完整实例攻略 简介 MyBatis是一个流行的Java持久化框架,它提供了一种简单而强大的方式来与数据库进行交互。在一些场景中,我们需要进行一对多的嵌套查询,即查询一个实体对象及其关联的多个子对象。本攻略将详细介绍如何在MyBatis中实现一对多嵌套查询,并提供两个示例说明。 步骤 步骤1:创建数据库表和实体类 首先,我们需要创…

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