c++11之default和=delete

本文原文来自《深入理解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;
}

C++11中的=delete和=default是两个C++关键字,它们都用于显式地声明或定义类的特殊成员函数。下面分别进行详细介绍: 1. =deleteC++11中,=delete关键字用于显式地禁用某些函数。例如,可以使用=delete关键字来禁用一个类的拷贝构造函数和拷贝赋值运算符,从而避免对象的浅拷贝问题,例如: ``` class MyClass { public: MyClass(int x) { // 构造函数 } MyClass(const MyClass&) = delete; // 禁用拷贝构造函数 MyClass& operator=(const MyClass&) = delete; // 禁用拷贝赋值运算符 }; ``` 在上述代码中,使用=delete关键字禁用了拷贝构造函数和拷贝赋值运算符,这样就可以避免对象的浅拷贝问题。如果需要拷贝对象,可以手动编写拷贝函数。 需要注意的是,使用=delete关键字声明函数时,该函数不能被调用,否则会在编译时产生错误。 2. =defaultC++11中,=default关键字用于显式地定义默认函数。例如,可以使用=default关键字来显式地定义一个类的默认构造函数、拷贝构造函数、拷贝赋值运算符和析构函数,例如: ``` class MyClass { public: MyClass() = default; // 显式地定义默认构造函数 MyClass(const MyClass&) = default; // 显式地定义拷贝构造函数 MyClass& operator=(const MyClass&) = default; // 显式地定义拷贝赋值运算符 ~MyClass() = default; // 显式地定义析构函数 }; ``` 需要注意的是,使用=default关键字定义函数时,该函数的实现必须符合默认函数的行为,否则会在编译时产生错误。 总之,C++11中的=delete和=default关键字扩展了它们的用途,使得程序员可以更加灵活地控制对象的行为。同时,它们也提高了程序的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值