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日

相关文章

  • js进行redirect

    什么是重定向? 重定向是指用户从一个URL自动跳转到另一个URL地址的过程。重定向可以用于网站URL优化、网站的访问控制、网站的问统计等方面。 JavaScript进行重定向 JavaScript可以通过window.location对象进行重定向。以下是JavaScript进行重定向的步骤: 步骤1:使用window.location对象 使用window…

    other 2023年5月7日
    00
  • ElementUI 修改默认样式的几种办法(小结)

    下面我将详细讲解一下“ElementUI 修改默认样式的几种办法(小结)”的完整攻略。 样式修改方式 在使用 ElementUI 时,我们通常需要对一些默认的组件样式进行修改,以满足业务需求。下面是几种常用的样式修改方式: 1. 使用深度作用选择器 通过使用 >>> 或 /deep/,可以将样式的作用范围扩大到组件内部。例如: <st…

    other 2023年6月27日
    00
  • 详解Java抽象类与普通类的区别

    下面我将详细讲解“详解Java抽象类与普通类的区别”,并提供两条示例说明。 什么是抽象类? 首先,我们来了解一下什么是抽象类。抽象类是一种特殊的类,它不能被实例化,只能作为其他类的父类被继承,子类必须实现其抽象方法才能被实例化。抽象类的关键字是“abstract”。 抽象类和普通类的区别 接下来,我们来看一下抽象类和普通类的区别,主要有以下几点: 实例化:抽…

    other 2023年6月27日
    00
  • Win2003不重启计算机情况下重新启动网卡的方法分享

    下面是关于“Win2003不重启计算机情况下重新启动网卡的方法分享”的完整攻略: 方法简介 在Windows Server 2003系统中,我们有时需要重新启动网络适配器(网卡),以解决一些网络问题,例如网络速度缓慢、无法连接网络等。但是,如果我们重启计算机,会影响到正在运行的服务和应用程序,造成不必要的损失。那么如何在不重启计算机的情况下,重新启动网卡呢?…

    other 2023年6月27日
    00
  • .NET 开源配置组件 AgileConfig的使用简介

    AgileConfig简介 AgileConfig是一个针对.NET Core应用程序开源的配置中心管理组件,支持分布式、集群环境下的配置管理和同步。可以帮助开发者和运维人员实现应用的配置集中管理。 AgileConfig的使用步骤 1. 安装AgileConfig AgileConfig可以通过Nuget包管理器来安装,也可以从GitHub下载源码进行安装…

    other 2023年6月27日
    00
  • lua使用string.split(str ‘ ‘)

    当然,我可以为您提供有关“Lua使用string.split(str, delimiter)”的完整攻略,以下是详细说明: Lua使用string.split(str, delimiter)函数 在Lua中,如果需要将一个字符串按照指定的分隔符进行分割,可以使用string.split(str, delimiter)函数。该函数将返回一个由分割后的子字符串组…

    other 2023年5月7日
    00
  • 一个较新的ASP后门服务端实现代码

    下面是一个较新的ASP后门服务端实现代码的完整攻略: 标题:ASP后门服务端实现代码 介绍: 本文将会详细讲解ASP后门服务端实现代码的攻略。ASP是基于微软的IIS服务器的一种服务器端脚本语言,ASP后门服务端实现使用ASP语言编写,用于在未经授权的情况下控制远程服务器。 步骤一:选择ASP后门服务端实现代码 首先,我们需要选择一个可靠的ASP后门服务端实…

    other 2023年6月27日
    00
  • React 项目中动态设置环境变量

    动态设置环境变量是指,在 React 项目运行过程中,使用程序代码对项目的环境变量进行修改、新增或删除的过程。 以下为详细的操作步骤及示例说明: 步骤: 首先,需要创建一个 .env 文件,用于存放环境变量,文件名必须以 .env 结尾。 在 .env 文件中添加所需要的环境变量,按照 KEY=VALUE 的格式进行书写,例如:REACT_APP_API_K…

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