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. ...
随机推荐
- VUE学习-计算属性与监听器
计算属性与监听器 计算属性 当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新 <div id="example"> ...
- JS学习-Canvas-Transformations变换
Canvas -Transformations变换 save() 保存画布(canvas)的所有状态 restore() 是 Canvas 2D API 通过在绘图状态栈中弹出顶端的状态,将 canv ...
- 第八章:diff
1.git diff命令的格式 1]可以使用git diff命令的来源,(任意树对象.工作目录.索引) 2]git diff命令进行树比较时,可以通过(提交名.分支名.标签名) 3]git d ...
- WDA学习(24):Context Menu使用
1.17 UI Element:Context Menu使用 本实例测试创建Context Menu. 1.创建Component,View: V_CONTEXT_MENU; 2.创建Context节 ...
- Go语言互斥锁(sync.Mutex)和读写互斥锁(sync.RWMutex)
暴力锁 package main import ( "fmt" "sync" "time" ) /* Go语言包中的 sync 包提供了两种 ...
- js - class 操作
js - class 操作 // 添加 function addClass(dom, classNameString = '') { if (!dom.className.length) dom.cl ...
- ubuntu20关机慢: A stop job is running for Snappy daemon
Ubuntu 20 关机超时 问题 A stop job is running for Snappy daemon [1 min 30s ] 解决办法 1.修改以下配置文件超时时间,如下: sudo ...
- 单文件WSDL,非模块化
最近在使用CXF做WebService Sever端,接口与实现类不在一个包下. 实现类如下: 1 @WebService(serviceName = "Demo" 2 , tar ...
- ConcurrentHashMap在Java8中的变化
增加红黑树这个存储结构 在Java8中,为什么要增加红黑树这种数据结构来进行存储,而不是全部使用链表来进行存储呢? 1.因为攻击者可以构造大量具有相同hashCode的内容,使其全部放在同一个列表中, ...
- linux中 查看 CPU 内存负载 磁盘IO 网络IO情况
1.压测时如何观察机器的CPU负载 先来看一个最最常用的监测linux机器性能的命令,就是top命令,直接在linux命令行只能够输入top指令就可以了,然后我们这里来给大家解释一下,top指令展示出 ...