c++关键字default,delete

概述

在看一些开源项目的源码的时候,经常会看到default和delete。这2个关键字究竟什么意思呢?这篇文章就来一点一点拆解下。

default

默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析构函数的显式默认化;
C++11允许开发者使用 default 关键字来显式要求编译器生成默认的特殊成员函数。这通常用于当类需要自定义一些特殊成员函数,但又想保留其他成员函数的默认行为时。看如下代码:

class MyClass {
public:
    MyClass() = default;  // 显式使用编译器生成的默认构造函数
    MyClass(const MyClass&) = default;  // 显式使用编译器生成的拷贝构造函数
    ~MyClass() = default;  // 显式使用编译器生成的默认析构函数
    // 其他成员函数...
};

delete

在C++中,delete 关键字用于删除函数、构造函数或默认的特殊成员函数(默认构造函数、拷贝构造函数、移动构造函数、拷贝赋值运算符、移动赋值运算符和析构函数)。使用 delete 可以防止编译器自动生成这些函数,或者覆盖默认实现。
1.删除默认构造函数:
如果一个类不需要默认构造函数,可以使用 delete 来删除它。

class NoDefault {
public:
    NoDefault(int x) : x(x) {}  // 只提供一个带参数的构造函数
private:
    int x;
public:
    NoDefault() = delete;  // 禁止使用默认构造函数
};

2.删除拷贝构造函数和拷贝赋值运算符:
对于需要管理资源的类,可能不希望对象被拷贝,这时可以使用 delete 来删除拷贝构造函数和拷贝赋值运算符。
如下代码:

class NoCopy {
public:
    NoCopy(const NoCopy&) = delete;
    NoCopy& operator=(const NoCopy&) = delete;
};

3.删除移动构造函数和移动赋值运算符:
如果类不需要移动语义,可以删除移动构造函数和移动赋值运算符。
如下代码:

class NoMove {
public:
    NoMove(NoMove&&) = delete;
    NoMove& operator=(NoMove&&) = delete;
};

4.删除析构函数:
通常析构函数不会被删除,因为它用于释放资源。但是,如果类中没有需要手动释放的资源,可以删除析构函数,让编译器生成默认的析构函数。
如下代码:

class NoDestructor {
public:
    ~NoDestructor() = delete;  // 通常不推荐这样做
};

5.删除所有默认的特殊成员函数:
C++11引入了一种语法,可以一次性删除所有默认的特殊成员函数。

如下代码:

class AllDeleted {
public:
    AllDeleted() = delete;
    AllDeleted(const AllDeleted&) = delete;
    AllDeleted(AllDeleted&&) = delete;
    ~AllDeleted() = delete;
    AllDeleted& operator=(const AllDeleted&) = delete;
    AllDeleted& operator=(AllDeleted&&) = delete;
};

小结

好了,看完这些,是不是有点了解了。以后看起来一些源代码会轻松很多。感兴趣吗,一起学习。顺便说一句,使用 delete 关键字可以提供对类行为更细致的控制,特别是在资源管理和对象生命周期管理方面。然而,过度使用 delete 可能会导致类的使用变得复杂和受限。OK,翻篇!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值