0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++11新的类功能(特殊成员函数、override和final)

冬至子 来源:iDoitnow 作者:艰默 2023-07-18 16:02 次阅读

1. 特殊的成员函数

C++11在原有的4个特殊成员函数(默认构造函数、复制构造函数、复制赋值运算符和析构函数)的基础上新增了移动构造函数和移动赋值运算符。这些特殊成员函数在各种情况下是会通过编译器自动提供的。

  • 默认构造函数 :如果未定义任何构造函数,编译器将提供一个默认构造函数,对于类成员则调用其默认构造函数(对于内置的成员,默认构造函数不对其进行初始化。如果使用者提供了移动构造函数,编译器将不会自动提供默认构造函数)。
  • 复制构造函数 :如果未定义复制构造函数,而代码有需要使用它,编译器将提供一个默认的复制构造函数。(如果使用者提供了类的移动构造函数的情况下,编译器将不会自动提供复制构造函数)
  • 移动构造函数 :如果未定义移动构造函数,而代码有需要使用它,编译器将提供一个默认的移动构造函数。(如果使用者提供了类的析构函数、复制构造函数、复制赋值运算符或移动赋值运算符的情况下,编译器将不会自动提供移动构造函数)
  • 复制赋值运算符 :如果未定义复制赋值运算符,而代码有需要使用它,编译器将提供一个默认的复制赋值运算符。(如果使用者提供了移动赋值运算符,编译器不会自动提供复制赋值运算符)
  • 移动赋值运算符 :如果未定义移动赋值运算符,而代码有需要使用它,编译器将提供一个默认的移动赋值运算符。(如果使用者提供了复制构造函数、移动构造函数、复制赋值运算符或析构函数,编译器不会自动提供移动赋值运算符)

当用户在定义某些特殊函数后,导致另外某个特殊函数不会自动创建,这时候用户仍可以使用关键词 default 强制编译器生成隐式声明的目标特殊成员函数函数。例如用户定义了移动构造函数,编译器不会自动构建默认构造函数、复制构造函数和复制赋值运算符,这种情况下我们可以通过default强制编译器创建这些方法的默认版本:

class A{
    public:
    A(A &&);
    A() = default;
    A(const A&) = default;
    A & operator = (const A&) = default;
};

同时,有些时候,我们不希望编译器为我们提供某个特殊的成员函数默认版本,我们可以使用关键字delete来禁止编译器使用特定方法。 关键字default只能用于这个6个特殊的成员数(默认构造函数、复制构造函数、复制赋值运算符、移动构造函数、移动赋值运算符和析构函数),但delete可以用于任何成员函数 。例如:

class A{
    public:
    A() = delete;//禁止编译器生成默认构造函数
    void readDoubleNum(double);
}

class B{
    public:
    B() = delete;//禁止编译器生成默认构造函数
    void readDoubleNum(double);
    void readDoubleNum(int) = delete;//禁用readDoubleNum函数的特定转换
};

A a;
a.readDoubleNum(5.0);//正确
a.readDoubleNum(5);//正确,int值5将被转换为5.0,进而执行readDoubleNum(double)方法

B b;
b.readDoubleNum(5.0);
b.readDoubleNum(5);//错误,其与readDoubleNum(int)原型匹配,编译器检测到该方法被禁用后,在编译阶段就会报错,防止int到double的特定转换

2. override和final

  • override标识符
    override说明符的作用是用来指定一个虚函数覆盖另外一个虚函数。其用法如下:

    class A{
        virtual void fun();
        ...
    };
    
    class B : A{
        void fun() override;//B::fun将覆盖A::fun
        ...
    };
    

    C++11引入override标识符的目的就是为了在重写基类的方法时候,防止重写方法的类型、名称和参数列表因为人为因素造成其与基类的不一致,无法使用多态。使用override标识符将重写的检查工作(重写方法的类型、名称和参数列表要与基类的保持一致)交给编译器处理,减少人为出错的可能。

  • final标识符

final标识符的作用是指定某个虚函数不能在派生类中被覆盖,或者某个类不能被派生。其使用方法如下:

calss A{
    virtual void fun();
};

class B : A{
    void fun() final;//A::fun被覆盖,而且B::fun是最终被覆盖函数
    void ba() final;//错误,ba非虚函数,因此它不能是final
};

class C final: B{//C为final
    void fun() override;//错误,fun不能被覆盖,因为其在B中为final
};

class D : C{};//错误,因为类C位final,其不可以被派生
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49109
  • C++语言
    +关注

    关注

    0

    文章

    147

    浏览量

    6989
  • 运算符
    +关注

    关注

    0

    文章

    172

    浏览量

    11081
收藏 人收藏

    评论

    相关推荐

    使用C++11新特性实现一个通用的线程池设计

    C++11标准之前,多线程编程只能使用pthread_xxx开头的一组POSIX标准的接口。从C++11标准开始,多线程相关接口封装在了C++的std命名空间里。
    的头像 发表于 12-22 13:58 1283次阅读
    使用<b class='flag-5'>C++11</b>新特性实现一个通用的线程池设计

    vc的常用成员函数

    CRect:用来表示矩形的,拥有四个成员变量:top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:
    发表于 08-02 06:33

    成员函数中const的使用,有什么注意事项?

    成员函数中const的使用,有什么注意事项?
    发表于 04-26 06:42

    如何在rt-thread的env环境中配置C++11

    1、rt-thread的env环境是否支持C++112、如何在rt-thread的env环境中配置C++11
    发表于 05-06 09:52

    C++中的私有函数消除方法

    私有访问是 C++ 中三种访问权限的一种,是访问权限中最严格的。对象的私有成员分私有函数和私有数据两部分,其中私有数据有特殊的作用;但是私
    发表于 06-29 15:45 38次下载
    <b class='flag-5'>C</b>++中的私有<b class='flag-5'>函数</b>消除方法

    成员函数与普通函数的区别研究

    本文的目的是研究成员函数与普通函数之区别,以及不同调用方式之间的区别,进而通过内联汇编语句模仿特定的调用,从而完成通过普通函数指针调用
    发表于 09-15 14:52 32次下载

    final关键字的用法

    在Java中,final关键字可以用来修饰、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。 1.修饰
    发表于 09-27 10:36 0次下载
    <b class='flag-5'>final</b>关键字的用法

    《深入理解C++11C++11新特性解析与应用的详细电子教材免费下载

    国内首本全面深入解读 C++11 新标准的专著,由 C++ 标准委员会代表和 IBM XL 编译器中国开发团队共同撰写。不仅详细阐述了 C++11 标准的设计原则,而且系统地讲解了 C++11
    发表于 08-27 08:00 0次下载

    C++:详谈构造函数

    构造函数是一个特殊成员函数,名字与名相同,创建类型对象的时候,由编译器自动调用,在对象的生
    的头像 发表于 06-29 11:44 1711次阅读
    <b class='flag-5'>C</b>++:详谈构造<b class='flag-5'>函数</b>

    EE-128:C++中的DSP:从C++调用汇编成员函数

    EE-128:C++中的DSP:从C++调用汇编成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C</b>++中的DSP:从<b class='flag-5'>C</b>++调用汇编<b class='flag-5'>类</b><b class='flag-5'>成员</b><b class='flag-5'>函数</b>

    的申明和成员函数定义分离是什么

    前面我们学习了如何定义,以及如何使用成员,在前面我们把成员函数都定义在了的内部,接下来我
    的头像 发表于 02-27 15:33 918次阅读

    浅谈C++的mutable关键字

    C++11中推出了一种特殊的关键字:mutable用于修饰变量。它的作用是标注该变量一定会被修改,因此也就不是const类型。目的是为了使这些成员变量在被const关键字修饰的
    的头像 发表于 04-15 11:13 3779次阅读

    函数结构的定义和例程说明

    在理解拷贝构造函数前,还是有必要回顾下的构造函数基本概念。的构造函数是一种特殊
    的头像 发表于 04-19 11:35 1036次阅读

    8533-11 Final 数据表

    8533-11 Final 数据表
    发表于 07-11 19:58 0次下载
    8533-<b class='flag-5'>11</b> <b class='flag-5'>Final</b> 数据表

    重点了解一下C++11 包装器function

    C++提供了多个包装器,它们主要是为了给其他编程接口提供更一致或更合适的接口。C++11提供了多个包装器,这里我们重点了解一下包装器function。
    的头像 发表于 07-18 16:41 527次阅读