【C++11新特性】核心语言特性(二):defaulted&deleted函数

系列文章目录

【C++11新特性】核心语言特性(一):auto与decltype

【C++11新特性】核心语言特性(二):defaulted&deleted函数


目录

系列文章目录

前言

一、什么是defaulted&deleted函数?

二、应用场景

1.默认构造函数

2.函数模板

总结


前言

上一篇我们向大家讲述了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函数的基本概念以及一些典型应用场景,它们主要应用于类内的一些默认函数发生隐式生成或者删除的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值