c++11之default和=delete

本文介绍C++11中=default和=delete的作用,包括如何通过=default显式要求编译器生成默认函数,以及如何通过=delete阻止编译器生成特定函数。特别讨论了在声明了自定义构造函数后类不再成为POD类型的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文原文来自《深入理解c++11》中有关于=default和=delete的章节,本文做一个大致的整理,描述他们的大概语义,方便在编程过程中正确使用

/*
一个类默认有如下函数:
构造函数
拷贝构造函数
拷贝赋值函数(operator=) 
移动构造函数

此外,c++编译器还会为以下这些自定义类型提供全局默认构造函数

operator
operator &
operator &&
operator *
operator->
operator->*
operator new 
operator delete


注意:若是程序员声明了自定义版本的构造函数,则有可能导致定义的类型不再是pod类型的
 
*/

#include<type_traits>
#include<iostream>
using namespace std;

class TowCstor
{
    public:
        //在提供了带参版本的构造函数,则必须自行提供不带参数的版本,另外由于加入了自定义的带参版本,因而T
        //TowCstor不再是POD类型 
        TowCstor() =default;
        TowCstor(int i):data(i){}
        
    private:
    int data; 
        
 }; 
 
// int main()
// {
//     cout<<is_pod<TowCstor>::value<<endl;
//  } 

/*
有的时候我们希望限制一些默认函数的生成。最典型的时类的编写者有时需要禁止使用者使用拷贝构造函数,
之前我们的做法是将拷贝构造函数声明为private,并不提供实现。这样,如果有人想要使用拷贝构造函数,
编译器就会报错 
*/

class NoCopyCstor
{
    public:
    NoCopyCstor() =default;
    
    private:
    NoCopyCstor(const NoCopyCstor&); 
}; 

//int main()
//{
//    NoCopyCstor a;
//    NoCopyCstor b(a);  //编译报错 
//}
/*
上面的私有化拷贝构造函数可能会对友元类或者是函数造成麻烦。为了避免这种情况,我们在private的基础上
实现拷贝构造函数

而c++11 提供了 =delete 指示编译器不产生函数的却行版本。 
*/ 
class NoCopyCstor2
{
    public:
    NoCopyCstor2() =default;
    NoCopyCstor2(const NoCopyCstor2&) =delete; 
    private:
    
}; 

int main()
{
    NoCopyCstor2 a;
    NoCopyCstor2 b(a);  //编译报错
    return 0;
}

/*
一个类默认有如下函数:
构造函数
拷贝构造函数
拷贝赋值函数(operator=) 
移动构造函数

此外,c++编译器还会为以下这些自定义类型提供全局默认构造函数

operator
operator &
operator &&
operator *
operator->
operator->*
operator new 
operator delete


注意:若是程序员声明了自定义版本的构造函数,则有可能导致定义的类型不再是pod类型的
 
*/

#include<type_traits>
#include<iostream>
using namespace std;

class TowCstor
{
    public:
        //在提供了带参版本的构造函数,则必须自行提供不带参数的版本,另外由于加入了自定义的带参版本,因而T
        //TowCstor不再是POD类型 
        TowCstor() =default;
        TowCstor(int i):data(i){}
        
    private:
    int data; 
        
 }; 
 
// int main()
// {
//     cout<<is_pod<TowCstor>::value<<endl;
//  } 

/*
有的时候我们希望限制一些默认函数的生成。最典型的时类的编写者有时需要禁止使用者使用拷贝构造函数,
之前我们的做法是将拷贝构造函数声明为private,并不提供实现。这样,如果有人想要使用拷贝构造函数,
编译器就会报错 
*/

class NoCopyCstor
{
    public:
    NoCopyCstor() =default;
    
    private:
    NoCopyCstor(const NoCopyCstor&); 
}; 

//int main()
//{
//    NoCopyCstor a;
//    NoCopyCstor b(a);  //编译报错 
//}
/*
上面的私有化拷贝构造函数可能会对友元类或者是函数造成麻烦。为了避免这种情况,我们在private的基础上
实现拷贝构造函数

而c++11 提供了 =delete 指示编译器不产生函数的缺省版本。  (你可以理解为 把对应被修饰的函数“删掉”)
*/ 
class NoCopyCstor2
{
    public:
    NoCopyCstor2() =default;
    NoCopyCstor2(const NoCopyCstor2&) =delete; 
    private:
    
}; 

int main()
{
    NoCopyCstor2 a;
    NoCopyCstor2 b(a);  //编译报错
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值