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

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

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

相关文章

  • JavaScript实现大整数减法

    JavaScript实现大整数减法的完整攻略 本文将为您提供一份完整攻略,介绍如何使用JavaScript实现大整数减法,并提供两个示例说明。 实现思路 大整数减法的实现思路与大整数加法类似,只需要将减数取相反数,然后使用大整数加法即可。具体步骤如下: 判断被减数和减数的符号,如果不同,则将减数取相反数,然后使用大整数加法。 将被减数和减数转换为数组,并将数…

    other 2023年5月5日
    00
  • Xshell怎么开启布局管理?Xshell开启布局管理教程

    Xshell怎么开启布局管理 Xshell是一款功能强大的终端模拟器,可以通过开启布局管理来实现多个终端窗口的同时显示和管理。下面是详细的攻略: 步骤一:打开Xshell 首先,双击打开Xshell应用程序。 步骤二:创建新会话 在Xshell的菜单栏中,点击\”文件\”,然后选择\”新建\”,再选择\”会话\”。这将打开一个新的会话窗口。 步骤三:开启布局…

    other 2023年9月5日
    00
  • centos7下搜狗输入法的安装教程

    centos7下搜狗输入法的安装教程 搜狗输入法是众多中文输入法中的佼佼者,拥有着更加智能生动的输入体验。本文将为大家介绍在CentOS7系统上安装搜狗输入法的步骤。 一、安装依赖 在安装搜狗输入法之前,我们需要先安装好其所依赖的环境。 sudo yum install -y gtk2 im-chooser glibc 其中,gtk2 是 GTK+ 本地库,…

    其他 2023年3月29日
    00
  • word菜单栏开发工具和加载项怎么自定义?

    自定义Word菜单栏开发工具和加载项可以帮助用户快速访问自定义的宏和功能,提高工作效率。下面是关于如何自定义word菜单栏开发工具和加载项的攻略: 一、添加开发工具选项卡 打开Word,依次点击文件 – 选项 – 自定义功能区,在“主选项卡”下拉列表中选择“开发工具”,点击确定。此时开发工具选项卡会出现在Word的菜单栏上。 点击开发工具选项卡,可以看到其中…

    other 2023年6月25日
    00
  • Python的类实例属性访问规则探讨

    Python的类实例属性访问规则探讨 在Python中,类是一种用于创建对象的蓝图。每个类可以有多个实例,而每个实例都可以具有自己的属性。在本文中,我们将探讨Python中类实例属性的访问规则。 1. 实例属性的定义和访问 在Python中,实例属性是在类的方法中定义的变量。每个实例都可以具有不同的属性值。下面是一个示例: class Person: def…

    other 2023年8月20日
    00
  • matlab中copyfile的使用

    Matlab中copyfile的使用 在Matlab中,copyfile函数可以用来复制文件或目录。本篇文章将介绍如何使用Matlab中的copyfile函数来复制文件以及常见的错误和处理方式。 复制文件 通过copyfile函数可以复制单个文件: copyfile(‘source_file.txt’, ‘destination_file.txt’) 上述代…

    其他 2023年3月28日
    00
  • PHP MYSQL简易交互式站点开发

    PHP MYSQL简易交互式站点开发 – 完整攻略 简介 本攻略将介绍如何使用PHP和MYSQL开发交互式站点。我们将使用PHP来处理后端逻辑,MYSQL来存储数据等详细步骤。 步骤 步骤1:环境搭建 运行PHP和MYSQL,可以通过在本地电脑上安装WAMP或XAMPP来快速搭建基本的环境。 步骤2:创建数据库 打开MYSQL命令行,并创建一个数据库。如: …

    other 2023年6月27日
    00
  • iOS/iPadOS 14.6 开发者预览版 Beta 1正式发布

    iOS/iPadOS 14.6 开发者预览版 Beta 1正式发布是指苹果官方针对iOS及iPadOS开发者推出的系统预览版Beta 1版本,该版本最早只向苹果注册开发者推出,主要用于测试iOS/iPadOS系统的新特性、修复已知的系统缺陷以及提供更加稳定的系统环境。 具体的攻略步骤如下: 1. 准备工作 在开始使用iOS/iPadOS 14.6 开发者预览…

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