系列文章目录
【C++11新特性】核心语言特性(一):auto与decltype
【C++11新特性】核心语言特性(二):defaulted&deleted函数
目录
前言
上一篇我们向大家讲述了auto与decltype,它们能够自动的根据表达式推导数据类型,为程序员提供便利。本篇将向大家介绍全新的两种函数类型,defaulted&deleted。
一、什么是defaulted&deleted函数?
defaulted&deleted函数,从字面意义上我们可以把它们理解成默认的函数和已被删除的函数。在C++11当中,任何一个函数无论是成员函数还是非成员函数,都被区分为了两类:
a.默认函数,它可以显示的将一个默认函数声明出来,比如默认构造函数;
b.被删除的函数,它无法被任何形式的使用。
以下是它们的基本语法:
void FunA () = delete; //声明一个被删除的函数
void FunB () = default; //显示声明一个默认函数
void FunA (){ //Error
return;
};
void FunB (){
return;
};
void FunC (){
FunA(); //Error
FunB();
return;
}
二、应用场景
讲到这里很多人会产生疑惑,为什么要删除函数?我不用这个函数我不写它不就好了,为什么要写了然后删除?为什么要有defaulted,我写了它不就可以使用了吗?
的确,对于普通的函数来说,没用或者不想使用,不去声明它就好了,有使用的需求,声明定义它就好了。但是,在C++当中,有许多函数它是自动生成的,它是隐式存在的。
1.默认构造函数
在一个类当中,它通常会有一个默认构造函数,它是隐式存在的。在编程的过程当中,我们经常性的会需要阻止开发人员使用某一个类的默认构造函数,从而希望以我们预设的方式去构造这个类。
在C++98中,我们会把这个默认构造函数放入类的私有属性当中,从而使得外界无法使用它,虽然它依然存在。那么在C++11当中,我们只需要使用delete便可以阻止它的生成。
//C++98
class A{
private:
A(); //默认构造函数
public:
void fun();
};
//C++11
class B{
public:
B()=delete; //默认构造函数
void fun();
};
同样的,我们知道,如果我们为一个类定义了构造函数,那么它的默认构造函数就会被隐式的定义删除 ,当我们不希望这种隐式定义删除发生,就可以显示的将其定义为默认。
//C++98
class A{
private:
int a;
public:
A(int number){ //自定义构造函数,此时默认构造函数被定义为已删除,无法使用
a=number;
}
};
//C++11
class B{
private:
int b;
public:
B(int number){ //自定义构造函数,此时默认构造函数B()被定义为已删除
a=number;
}
B()=default; //显示定义默认构造函数B()为默认,B()可被使用
}
同理,以上对于默认拷贝、赋值、析构函数一样适用。
2.函数模板
对于某个函数模板来说,我们通常允许不同类型的参数使用此模板,但有些时候,我们希望某些类型禁止使用此模板,此时就可以使用deleted函数。
class A{
public:
template<typename T>
void fun(T a) { … }
};
template<>
void A::fun<int>(int) = delete; //删除T为int的情况
总结
本文介绍了defaulted&deleted函数的基本概念以及一些典型应用场景,它们主要应用于类内的一些默认函数发生隐式生成或者删除的场景。