C++11的override、default和delete关键字
最近在参与组里的项目时接触了很多以前自己没太了解的C++语法(尤其是C++11以后出现的),今天给大家讲一下C++11新出的override和default关键字。
override关键字主要在声明类的成员函数时使用,它的作用就是告知程序员和编译器这个函数是重写了父类的虚函数,一方面代码的阅读者看到这个关键字标识就知道这是一个重写的函数;另一方面也给编译器进行检测:如果这个函数实际上没有重写父类的虚函数则会报错:
class A
{
public:
virtual void func1();
void func2();
};
class B:public A
{
public:
//A的func1是虚函数,可以编译通过
void func1() override;
//A的func2不是虚函数,编译器会报错
void func2() override;
};
至于另一个关键字default,它是在强行指定某个构造函数为默认构造函数。众所周知,当一个类声明了一个带参数构造函数后,编译器便不会再帮助该类生成默认构造函数,此时可以通过=default显式将某个构造函数定义为默认构造函数(当然这个函数的参数要符合规范,也不需要定义的)。其实不止默认构造函数,也可以以此定义默认拷贝构造函数和析构函数,对每个特殊成员函数统一使用=default语法也使得使代码更容易阅读。
下面的代码通过default定义了A的默认构造函数和默认拷贝构造函数,也包括默认析构函数:
class A
{
public:
A() = default;
A(A&) = default;
~A() = default;
};
最后我们来提一下delete关键字,在C++11之前,它只是用于释放内存空间。C++11为它增加了新的意义:禁用某个类的成员函数。比如我们如果不想让某个类对象被拷贝,可以通过delete语法修饰它的拷贝构造函数:
class A
{
public:
A() = default;
A(const A&) = delete;
~A() = default;
};
int main()
{
A a;
A b = a; //编译器会报错,因为此时a的拷贝构造函数已经被禁用了
return 0;
}
delete还有一种常用的用法就是禁用某种类型转换的构造函数,使得无法将类转换为某种特定类型。
class A
{
public:
A(int) {}
A(double) = delete;
};
int main() {
A A1(1);
A A2(0.1);//编译器会报错,因为此时a从double构造的函数被禁用了
return 0;
}
最后说一句,delete关键字不仅可以用来修饰成员函数,也可以修饰非成员函数。比如说,我们希望一个函数只接受float类型的参数,那我们可以这样设计:
void func(float) {}
void func(double)=delete;
void func(int)=delete;
C++11的override、default和delete关键字的更多相关文章
- C++11的default和delete关键字
C11的新特性实在是太多了,这2个关键字关注的人倒是少了很多,其中有一个原因便是编译器支持得太慢了(VS到VS2013才支持上),不过这2个关键字那真是极为有用的,下面我们来看看. [default关 ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数
c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;
转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- C++ default 和delete的新用法
C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...
- C++中 =default 和 =delete 使用
编译器默认为一个类生成的默认函数 默认构造函数 默认析构函数 默认拷贝构造函数 默认赋值函数 移动构造函数 移动拷贝函数 class DataOnly { public: DataOnly () // ...
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
本章主要内容: 1)函数重载 2)C++调用C代码 3)new/delete关键字实现动态内存分配 4)namespace命名空间 大家都知道,在生活中,动词和不同的名词搭配一起,意义都会大有不同,比 ...
- C++学习11 类和new、delete操作符 类与const关键字
如果你是Java.C#.PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象. 在C++中,你可以像定义变量一样来创建对象,如: Student stu; //对象 ...
- C++ 11 :override 关键字的使用
override 关键字 作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数. 位置:函数调用运算符之后,函数体或纯虚函数标识 "= 0" ...
- c++11之override关键字
明确是用来 覆盖 用来对虚函数的 从新实现 加上后编译器就会帮我们去检查这个语法 总结就是:c++11允许派生类显示的注明它将使用那个成员函数改写基类的虚函数 https://blog.csdn. ...
随机推荐
- Jupyter Notebook安装代码提示功能
默认Jupyter Notebook没有安装代码提示功能,但是我们可以可通过如下命令安装和配置使得Jupyter Notebook具备代码提供功能. (确保Anaconda在环境变量里)1.电脑上搜索 ...
- ObjectARX2016-1打印HelloWolrd
首先把Objectarx2016和VS2012安装好,安装好之后,如果在VS2012创建项目的过程中出现创建项目失败的情况,可以查看我的第一篇随笔https://www.cnblogs.com/Arc ...
- mysql8 更改root密码(windows)
1.停止服务 net stop mysql; 2.控制台输入 mysqld --console --shared-memory --skip-grant-tables 3.重新打开一个窗口,进入bin ...
- div css 页面中心弹窗窗口
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- map()函数应用
title: map()函数应用 author: 杨晓东 permalink: map()函数应用 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...
- PCIe收发卡设计资料:611-基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡
基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡 一.板卡概述 基于XCVU9P的5Gsps AD DA收发PCIe板卡.该板卡要求符合PCIe 3.0标准,包含一片XCVU9P-2 ...
- LP1-3:一支钢笔的测试
UI: 长.宽 .高 钢笔:笔身.笔尖.笔帽 功能: 写字:出水量比较合适 笔帽能扣上,不容易掉 钢笔笔夹 打水 笔尖的粗细程度 容错性: 不能漏水 易用性: 是否光滑 笔尖是否可以换 笔囊是否可以换 ...
- ubuntu 20.04 基于kubeadm部署kubernetes 1.22.4集群—报错解决
一.添加node节点,报错1 注:可以提前在各node节点上修改好(无报错无需执行此项) yang@node2:~$ sudo kubeadm join 192.168.1.101:6443 --to ...
- js生成快速生成0~n的数组
Object.keys(Array.from(Array(100)))
- cam对象类型
//此函数的功能是打印当前坐标系试图的所有坐标系名称 static void geom_list_name(tag_t group_tag) { //ask_member_list int count ...