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. ...
随机推荐
- 解决QtCreator运行程序报plugin xcb的错误
解决方法:将对应项目的运行环境的LD_LIBRARY_PATH中的qt的库路径移到最前面,如下图: LD_LIBRARY_PATH可以指定查找共享库的路径,将qt的共享库移到前面,可以优先使用qt的库
- 像MIUI一样做Zabbix二次开发(6)——应用场景和规划
其他使用场景 监控做为一个重要的管理手段,存在很多的使用场景,简单列举我们现在碰到的: 1. 系统集成 事件管理流程集成:配置管理集成,自动CI获取,提高CMDB准确.实时性:知识库集成,提高 ...
- golang常见编程错误集
一.append是深拷贝, func main() { a := []int{7, 8, 9} fmt.Printf("%+v\n", a) ap(a) fmt.Println(& ...
- CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1.npm install -g increase-memory-limit 2.increase-memory-limit 3.重启解决
- No.1.4
选择器进阶 [复合选择器]:后代选择器:空格 语法:选择器1 选择器2 {css} 子代选择器:> 语法:选择器1>选择器2 {css} [并集选择器]:, 语法:选择器1 , ...
- python的下载安装与使用
一.python解释器版本 创作者:龟叔 1.1python1.X(可忽略) 1.2python2.x python2.x的最高版本是2.7版本,现在仍然有不少企业老项目在使用2.7版本 1.3pyt ...
- String.prototype.replace--替换字符串
str.replace(regexp|substr, newSubStr|function) API本身不改变原本的字符串,只是返回新的字符串例子:用函数作为第二个参数function rep ...
- createrepo 命令详解
createrepo 命令用于创建yum源(软件仓库),即为存放于本地特定位置的众多rpm包建立索引,描述各包所需依赖信息,并形成元数据. 语法: createrepo [option] <di ...
- es6数组去重、数组中的对象去重 && 删除数组(按条件或指定具体元素 如:id)&& 筛选去掉没有子组件的父组件
// 数组去重 { const arr = [1,2,3,4,1,23,5,2,3,5,6,7,8,undefined,null,null,undefined,true,false,true,'中文' ...
- DataStructures 01 日期抽象类设计与实现
1.思维导图以及学习体会 1.1 思维导图 1.2 学习体会 比较大的一个感概就是学习数据结构必须要一步一步来,前期切不可跳过思考过程, 最好的办法还是每一步慢慢分析,写在纸上,初期就要慢慢分析慢慢来 ...