C++11 的新特性 ——final override default

news2024/11/26 0:07:10

 链接:final 说明符 (C++11 起) - cppreference.com

目录

final的使用

1、不能使用 "final" 修饰符声明非虚函数

2、无法重写基类的“final”函数 "A::foo"

3、不能将“final”类类型用作基类

override 的使用 : 重写父类的虚函数

default 的使用 

 delete 的使用:弃置函数

 两点注意:

实例:

explicit 的使用: 避免隐式转换

  constexpr的使用

enum class 枚举类的使用


final的使用

1、不能使用 "final" 修饰符声明非虚函数

struct Base

{

    virtual void foo();

};

struct A : public Base

{

    void foo() final; // Base::foo 被覆盖而 A::foo 是最终覆盖函数

    void bar() final; // 错误:bar 非虚,因此它不能是 final 的

            // 不能使用 "final" 修饰符声明非虚函数

};

void A::foo()

{

}

2、无法重写基类的“final”函数 "A::foo"

struct B final : A // struct B 为 final

{

    void foo() override; // 错误:foo 不能被覆盖,因为它在 A 中是 final 的

            // 无法重写“final”函数 "A::foo"

};

3、不能将“final”类类型用作基类

struct C : B{}; // 错误:B 是 final 的

            //不能将“final”类类型用作基类

override 的使用 : 重写父类的虚函数

   C++11标准添加了一个override关键字放在派生类的虚函数后,如果编译器发现派生类重写的虚函数与基类的虚函数不一样(参数或其他不一样的地方),那么编译器将报错

    放在子类重写父类的方法声明的末尾,用来检测重写的方法的正确性

 通过这个功能,便于在项目中查找到对f父类虚函数进行重写时的错误。

default 的使用 

        声明为default的函数,编译器自动为其生成函数体

class A
{
public:
    // 声明为default的函数,编译器自动为其生成函数体
    A() = default;
    A(const A& a) = default;
    A(int a){}

};

int main()
{
    A a;
    return 0;
}

          class A,没有创建无参构造方法,之所以还可以 直接 “ A a; ”创建对象, 就是因为将A() = default;//声明为default的函数,编译器自动为其生成函数体

 delete 的使用:弃置函数

 参考:函数声明 - cppreference.com

           如果使用特殊语法 = delete; 取代函数体,那么该函数被定义为显式弃置的。任何弃置函数的使用都是非良构的(程序无法编译)。这包含调用,包括显式(以函数调用运算符)及隐式(对弃置的重载运算符、特殊成员函数、分配函数等的调用),构成指向弃置函数的指针或成员指针,甚至是在不潜在求值的表达式中使用弃置函数。但是可以隐式 ODR 使用刚好被弃置的非纯虚成员函数。

 两点注意:

1、如果函数被重载,那么首先进行重载决议,且只有在选择了弃置函数时程序才非良构

2、已经声明过的函数不能声明为弃置的

实例:

 

// 类A 不允许拷贝,不允许赋值运算符的重载, : 
// thread类就是如此实现的(thread允许移动语义,即夺取某个thread对内存的控制权)
class A
{
public:
    A() = default;

    A(const A& a) = delete; 
    A& operator=(const A& a) =delete;

    // A(const A& a)
    // {
    //     *this = a;
    // }
 
};
int main()
{
    A a;
    // A b(a);  当拷贝构造被声明为delete时,不能在被使用
    return 0;
}

类A的拷贝构造函数已经声明为弃置函数,无法再进行调用

explicit 的使用: 避免隐式转换

        以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。

#include <iostream>
class Test1
{
public :
	Test1(int num):n(num){}
private:
	int n;
};
class Test2
{
public :
	explicit Test2(int num):n(num){}
private:
	int n;
};
 
int main()
{
	Test1 t1 = 12;
	Test2 t2(13);
	//Test2 t3 = 14;//错误:无法从“int”转换为“Test2”
		
	return 0;
}

所以,加上explicit修饰, 指定这个构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用

  constexpr的使用

       指定变量或函数的值可以在常量表达式中出现

1、实例1

    constexpr int a = 10;   //常量
            // a++;                 //error:表达式必须是可修改的左值
    constexpr int b = 3.14 * 10;   //常量
    std::cout<<b<<std::endl;
    int c = 31;
    switch (c)
    {
    case b:     //constexpr修饰的变量,可以当作常量值使用
        std::cout<<b<<std::endl;
        break;
    default:
        break;
    }

2、实例2

    int x = 42;
    constexpr int size = x;  //此时会报错:表达式必须含有常量值C/C
    int a[size]; 

3、实例3

    //变量在运行时,进行赋值
    int x = 20;
    int y = 12;
    // std::array<int,sum(x,y)> a1;    //报错:表达式必须含有常量值
    
    //模板在编译器时确定
    //方法在运行时调用
    std::array<int,sum(1,2)> a2;

enum class 枚举类的使用

 优点:参考C++11枚举类——enum class-CSDN博客

1、降低命名空间污染

2、避免隐式类型转换

3、可以前置声明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端:布局(用于div中有多行元素,一行只显示四个,最左或最右要紧贴父div,最顶层和最底层也要紧贴父div)

效果 一、flex实现 html <!DOCTYPE html> <html><head><title>Flexbox Layout</title><style>.container {display: flex;flex-wrap: wrap;justify-content: space-between;gap: 10px;border: 1px solid red;}.box {flex: 1 0 calc(25% …

关于LIN总线,同步间隔段最大时间及各种间隔符最大时间的解释,与说明

1&#xff1a;LIN同步间隔段的最小长度 如果问&#xff01;LIN同步间隔段的最小长度&#xff1f;大多数同学会一口答出">13bit位的显性位" 那如果问&#xff01;最大长度是多少&#xff1f; 则很少有同学会会突然懵逼&#xff01; 资料上给出的答案&#xff0…

openssl3.2 - 官方demo学习 - guide - tls-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - tls-client-block.c概述记录问题server和client IP都为localhostserver和client IP都为127.0.0.1想到解决问题的方法1想到解决问题的方法2笔记END openssl3.2 - 官方demo学习 - guide - tls-client-block.c 概述 tls 客户端 官…

【HTML】-- 01 初识HTML

HTML 1.初识HTML Hyper Text Markup Language&#xff1a;超文本标记语言 1.1 W3C标准 W3C World Wide Web Consortium(万维网联盟)成立于1994年&#xff0c;Web技术领域最权威和最具影响力的国际中立性技术标准机构http://www.w3.org/http://www.chinaw3c.org/ W3C标准包括…

虚幻UE 特效-Niagara特效实战-火焰、烛火

在上一篇笔记中&#xff1a;虚幻UE 特效-Niagara特效实战-烟雾、喷泉 我们进行了烟雾和喷泉的实战&#xff0c;而今天这篇笔记 我们在不使用模板的前提下对火焰和烛火特效进行实战 文章目录 一、火焰1、创建火焰的Niagara系统2、分析火焰是怎样的特征3、优化设置 二、烛火1、创…

windows编译TensorFlowServing

概述 整个编译打包过程的总体思路&#xff0c;是参照在linux下的编译流程&#xff0c;配置环境&#xff0c;执行编译命令&#xff0c;根据编译器/链接器反馈的错误&#xff0c;修改相应的源码或者相关库文件的存放路径&#xff0c;编译出windows平台下静态库和二进制执行文件。…

深入了解Transformer:先进语言模型背后的两个强大引擎

Transformer模型的出现对自然语言处理&#xff08;NLP&#xff09;领域来说堪称革命性。在Transformer崛起之前&#xff0c;循环神经网络&#xff08;RNNs&#xff09;是处理序列数据的标准。然而&#xff0c;Transformer的引入在各种NLP任务中大大超越了RNN的性能&#xff0c;…

RTMP对接腾讯云问题记录

RTMP对接腾讯云问题分析报告 问题现象及原因分析 1. 连不上腾讯云RTMP服务器 连不上腾讯云RTMP服务器&#xff0c;抓包显示服务器在握手完成后&#xff0c;主动断开了当前TCP链接。问题原因可能是connect中的tcUrl不能把域名转为IP&#xff0c;导致在握手不久服务器主动断开…

vue3前端开发,感受一下组合式api和VUE2选项式的差异

vue3前端开发,感受一下组合式api和VUE2选项式的差异&#xff01;今天开始&#xff0c;正式开始&#xff0c;进入学习Vue3的内容。以后代码&#xff0c;案例分享&#xff0c;都会采用组合式api的模式为大家做展示。 今天是第一节&#xff0c;带大家感受一下&#xff0c;Vue3的组…

【C++入门到精通】智能指针 auto_ptr、unique_ptr简介及C++模拟实现 [ C++入门 ]

阅读导航 引言一、std::auto_ptr1. 简介2. 使用示例3. C模拟实现 二、std::unique_ptr1. 简介2. 使用示例3. C模拟实现 温馨提示 引言 在 C 中&#xff0c;智能指针是一种非常重要的概念&#xff0c;它能够帮助我们自动管理动态分配的内存&#xff0c;避免出现内存泄漏等问题。…

axios的原理及源码解析

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的使用 关于axios的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入配置 axio…

Python实战 -- PySide6 制作天气查询软件

一、环境准备 开发环境&#xff1a;Python 3.9.2 pycharm PySide6 申请天气情况 API &#xff1a;https://console.amap.com/dev/key/app designer 设计 ui 目录下 Weather.ui 转换为 Weather.py 结果显示 二、完整代码 import sysfrom PySide6 import QtWidgetsimport…

安全牧场,保障优质奶源 追溯羊奶品质

安全牧场&#xff0c;保障优质奶源 追溯羊奶品质 近年来&#xff0c;人们对食品安全和健康越来越关注&#xff0c;而安全牧场的兴起正能够满足人们对优质奶源的需求。安全牧场以严格的品质监控和科学的管理&#xff0c;为消费者提供可追溯的高品质羊奶产品。本文小编羊大师将为…

机器学习算法理论:贝叶斯

贝叶斯定理对于机器学习来说是经典的概率模型之一&#xff0c;它基于先验信息和数据观测来得到目标变量的后验分布。具体来说&#xff0c;条件概率&#xff08;也称为后验概率&#xff09;描述的是事件A在另一个事件B已经发生的条件下的发生概率&#xff0c;公式表示为P(A|B)&a…

前端公共组件库优化

背景 前段时间入职了新公司后&#xff0c;做一些内部前端基建的工作&#xff0c;其中一个工作就是优化现有的frontend-common公共组件库。之前的组件库一直是以源码依赖的形式存在&#xff0c;即各个项目通过git submodule的方式将该仓库引入到各个项目中&#xff0c;作为一个…

Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器(1)

文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待&#xff0c;只要有一个就绪&#xff0c;就使用select/poll系统调用&#xff0c;让操作系统把所有文件遍历一遍&#xff0c;哪些就绪就加上哪…

基于SURF算法的图像匹配

基础理论 2006年Herbert Bay提出了SURF算法&#xff0c;该算法是对SIFT算法的改进&#xff0c;不仅继承了SIFT算法的优点&#xff0c;而且比SIFT算法速度快。下面是SURF算法的步骤。 &#xff08;1&#xff09;建立积分图像 &#xff08;2&#xff09;构建尺度空间 &#x…

python使用Apache+mod_wsgi部署Flask

python使用Apachemod_wsgi部署Flask 一、安装python环境&#xff08;V3.10.10&#xff09;二、安装mod_wsgi三、安装Apache1、下载2、解压3、配置 四、安装项目依赖五、启动六、基于多端口部署多个flask项目 一、安装python环境&#xff08;V3.10.10&#xff09; 安装时勾选&q…

Elasticsearch:将数据从 Snowflake 摄取到 Elasticsearch

作者&#xff1a;来自 Elastic Ashish Tiwari 为了利用 Elasticsearch 提供的强大搜索功能&#xff0c;许多企业在 Elasticsearch 中保留可搜索数据的副本。 Elasticsearch 是一种经过验证的技术&#xff0c;适用于传统文本搜索以及用于语义搜索用例的向量搜索。 Elasticsearch…

C#,入门教程(38)——大型工程软件中类(class)修饰词partial的使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(37)——优秀程序员的修炼之道https://blog.csdn.net/beijinghorn/article/details/125011644 一、大型&#xff08;工程应用&#xff09;软件倚重 partial 先说说大型&#xff08;工程应用&#xff09;软件对源代码的文件及函数“…