c++11 类中关于default、explict、implicit、noexcept、final的详解

yizhihongxing

标题:C++11类中关于default、explicit、implicit、noexcept、final的详解

default

在C++11中,我们可以使用default关键字来显式地声明函数的默认实现,它的作用是生成编译器默认的函数实现。下面是一个示例:

class MyClass {
public:
    MyClass() = default;
    MyClass(const MyClass& other) = default;
    MyClass& operator=(const MyClass& other) = default;
    ~MyClass() = default;
};

通过在函数声明后添加= default,我们告诉编译器不要生成默认的函数实现,而是使用预定义的默认实现。

explicit

explicit关键字可以用于禁止隐式转换,只有当我们用explicit修饰构造函数时,就不再允许隐式转换了。下面是一个示例:

class Example {
public:
    explicit Example(int n) {
        // ...
    }
};

void test() {
    Example ex1 = 123; // error: conversion from 'int' to 'Example' is not allowed
    Example ex2(123); // OK
}

在上面的例子中,我们使用了explicit关键字来修饰Example的构造函数,这样我们就可以禁止隐式转换了。当我们使用Example ex1 = 123;时,就会编译错误,我们必须使用显式的方式创建Example对象,即Example ex2(123);

implicit

explicit相对的是implicit关键字,它用于将单参数的构造函数定义为隐式转换。例如:

class Example {
public:
    Example(int n) {
        // ...
    }
};

void test() {
    Example ex = 123; // OK
}

在上面的例子中,Example的构造函数只有一个参数,我们并没有使用explicit关键字,因此可以进行隐式转换。当我们执行Example ex = 123;这一语句时,编译器会自动将123转换为一个Example对象。

noexcept

noexcept关键字用于指示函数不会抛出异常。这有助于编译器为我们生成更高效的代码。下面是一个示例:

void do_something() noexcept {
    // ...
}

void another_func() {
    try {
        do_something();
    } catch (...) {
        // ...
    }
}

在上面的例子中,do_something()被声明为noexcept,因此当我们在another_func()中调用这一函数时,我们就不需要添加异常处理,因为它不会抛出任何异常。

final

final关键字用于防止派生类重写基类中的虚函数。我们可以在虚函数后添加final关键字,来指定其为“终止态”,也就是不能被派生类重写。下面是一个示例:

class Base {
public:
    virtual void foo() final {
        // ...
    }
};

class Derived : public Base {
public:
    virtual void foo() override { // error: 'Derived::foo' : overriding virtual function has been marked final
        // ...
    }
};

在上面的例子中,Base类的foo()函数被标记为final,因此在Derived类中我们不再可以重写这一函数了。当我们尝试编译Derived类时,就会收到错误提示,指出我们试图重写一个被标记为final的虚函数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11 类中关于default、explict、implicit、noexcept、final的详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 简单说说angular.json文件的使用

    下面是“简单说说angular.json文件的使用”的完整攻略。 什么是angular.json文件? angular.json是Angular项目的核心配置文件,它包含了项目的所有配置信息,包括构建选项、样式、脚本、插件等等。在Angular CLI中,使用angular.json文件来进行项目配置和构建。在一般情况下,我们不需要手动修改该文件。 angu…

    C 2023年5月23日
    00
  • 荣耀畅玩8c手机如何分屏?荣耀畅玩8c分屏教程

    下面是荣耀畅玩8c手机如何分屏的完整攻略: 一、什么是分屏功能 分屏功能是荣耀畅玩8c手机的一项特色功能,它可以让你同时在同一个屏幕上,使用两个应用程序。 二、如何开启分屏功能 荣耀畅玩8c手机的分屏功能很容易使用,具体步骤如下: 先打开一个想要使用的应用程序,例如微信。 按住主屏幕底部左侧的“返回键不放”,直到屏幕出现一个小框框。 放开“返回键”后,屏幕就…

    C 2023年5月23日
    00
  • 实际使用到底怎么样?JDB二合一Type-C麻花线评测

    以下是详细讲解“实际使用到底怎么样?JDB二合一Type-C麻花线评测”的完整攻略: 评测背景 本次评测的对象是JDB二合一Type-C麻花线,该产品是一款支持同时充电和传输数据的Type-C接口数据线。我们将通过使用该产品,结合实际的使用场景,来对其性能进行评测。 测试环境 MacBook Pro 2019(Type-C接口) Samsung Galaxy…

    C 2023年5月23日
    00
  • C语言中如何进行算法优化?

    C语言算法优化攻略 1. 使用基本数据类型 在编写C语言算法时,应尽可能使用基本数据类型,避免使用浮点数和双精度浮点数,因为基本数据类型的处理速度更快。例如,可以使用整数代替小数进行计算,使用位运算代替乘除法等。 2. 减少循环嵌套 循环嵌套是C语言中实现算法的基础,但也是最容易导致程序性能瓶颈的地方。因此,在编写算法时应尽可能减少循环嵌套,避免不必要的复杂…

    C 2023年4月27日
    00
  • C++ STL中五个常用算法使用教程及实例讲解

    C++ STL中五个常用算法使用教程及实例讲解 作为C++语言的标准库之一,STL(Standard Template Library)提供了很多有用的容器和算法,让C++开发者更加高效地编写程序。本文将介绍STL中的五个常用算法,包括排序、查找、遍历、求和和去重,并以实例的形式展示具体使用方法。 排序算法 STL中提供了两个常用的排序算法,即sort和st…

    C 2023年5月22日
    00
  • vue中ts无法识别引入的vue文件,提示找不到xxx.vue模块的解决

    在Vue项目中使用TypeScript,当我们通过import导入.vue文件时,TS可能会抱怨找不到模块。这是因为TypeScript没有为.vue文件定义类型声明。为了解决这个问题,需要安装”vue-class-component”和”vue-property-decorator”两个库,并对tsconfig.json文件进行一些配置。 以下是具体步骤:…

    C 2023年5月23日
    00
  • jQuery使用ajax方法解析返回的json数据功能示例

    下面是详细讲解“jQuery使用ajax方法解析返回的json数据功能示例”的完整攻略。 简介 jQuery是一种流行的JavaScript库,它简化了客户端JavaScript编程。其中一个功能是使用ajax方法向服务器发送HTTP请求,并从服务器接收响应。响应可以是各种格式,包括HTML、XML和JSON等。本文将演示如何使用jQuery的ajax方法来…

    C 2023年5月23日
    00
  • 从C语言中读取Python 类文件对象

    要从C语言中读取Python类文件对象,需要使用Python提供的C API。下面是一些步骤: 导入必要的头文件 在使用Python的C API之前,需要包含必要的头文件,其中最重要的是Python.h。在C语言中,导入头文件通常使用#include指令。 #include <Python.h> 初始化Python解释器 在使用Python的C …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部