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

标题: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日

相关文章

  • Redis中的动态字符串学习教程

    Redis中的动态字符串学习教程 1. 什么是Redis中的动态字符串 Redis中的动态字符串是Redis内部实现的一种字符串类型。与C语言中的char *指针不同,Redis动态字符串是一个结构体,可以方便地进行操作和管理。Redis动态字符串具有如下特点: 可以保存二进制数据 可以自动扩展空间以容纳更多数据 最大长度是512MB,远大于C语言的字符串限…

    C 2023年5月22日
    00
  • C语言随机数生成教程(rand和srand用法)

    C语言中的rand()函数用于生成随机数,下面详细讲解C语言随机数生成教程并介绍rand()和srand()的用法。 一、rand()函数 rand()函数用于生成随机数,该函数在头文件stdlib.h中定义,它没有参数,返回值为一个整数,该整数为随机生成的伪随机数,取值范围为0到RAND_MAX(通常为32767)。 下面的例子将生成1到100之间的随机整…

    C 2023年5月23日
    00
  • Go 语言 json解析框架与 gjson 详解

    Go 语言 json解析框架与 gjson 详解 介绍 在 Golang 中,解析 JSON 数据是一项非常常见的任务。Go提供了标准的JSON包,可以轻松地将JSON数据编组和解组。但是,在使用标准JSON包解析大型复杂JSON结构时,可能存在些许不足,例如代码冗余,性能瓶颈等问题。针对这些问题,目前有许多优秀的JSON解析框架,GJSON是其中一个很不错…

    C 2023年5月23日
    00
  • IOS开发之路–C语言构造类型

    IOS开发之路–C语言构造类型 概述 在IOS开发中,C语言是必须要掌握的一门语言。而C语言中的构造类型在IOS开发中也有着广泛应用,例如结构体struct、枚举类型enum等等。本文将详细讲解C语言构造类型的使用步骤,以及在IOS开发中的应用。 结构体struct 结构体是一种将不同数据类型的数据按一定的顺序放在一起的自定义数据类型。在IOS开发中,结构…

    C 2023年5月23日
    00
  • C++ 设置和获取当前工作路径的实现代码

    一、C++ 获取当前工作路径的实现代码 为了获得当前正在执行程序的工作目录,我们可以使用C++标准库函数getcwd。getcwd可以在头文件unistd.h中找到。它的原型是: char *getcwd(char *buf, size_t size); 该函数返回当前工作路径的字符串指针,buf是一个指向存储路径名的字符数组的指针。size应该是buf的长…

    C 2023年5月23日
    00
  • C++实现学生信息管理系统(完整版)

    C++实现学生信息管理系统(完整版)攻略 准备工作 首先,在开始编写C++代码前,需要先配置好C++编译环境,比如Visual Studio或者Code::Blocks等等。 第二,我们需要了解一些基本的C++语法,比如变量、数据类型、函数等等。 实现步骤 步骤一:设计数据结构 在开始编写实现学生信息管理系统的程序之前,需要首先设计好数据结构。这里我们考虑使…

    C 2023年5月24日
    00
  • C/C++ – 从代码到可执行程序的过程详解

    那我就详细讲解一下C/C++代码从源码到可执行程序的过程,包括编译、链接和生成可执行文件的流程。具体的攻略如下: 一、编译过程 1. 预处理器(Preprocessor) 编译指令 gcc -E main.c -o main.i 或 g++ -E main.cpp -o main.i 将源代码文件 main.c 或 main.cpp 放入预处理器,对含有 #…

    C 2023年5月23日
    00
  • Qt如何设置窗口屏幕居中显示以及设置大小

    关于Qt如何设置窗口屏幕居中显示以及设置大小,以下是一份完整攻略: 设置窗口居中 如果我们想让Qt应用程序中的窗口在启动时居中显示,可以按照以下步骤操作: 获取屏幕的Geometry:cpp QDesktopWidget* desktop = QApplication::desktop(); QRect screen = desktop->screen…

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