【重学C++】【类】很简单,但很实用:default 和 delete 关键字让你更精准控制类的行为

大家好,我是 同学小张,持续学习C++进阶知识AI大模型应用实战案例,持续分享,欢迎大家点赞+关注,共同学习和进步。

重学C++系列文章,在会用的基础上深入探讨底层原理和实现,适合有一定C++基础,想在C++方向上持续学习和进阶的同学。争取让你每天用5-10分钟,了解一些以前没有注意到的细节。


本文我们学习下现代C++中允许开发者更精确控制类的行为的两个特性:默认函数和删除函数,涉及两个关键字:defaultdelete。很简单,但很实用。

0. default关键字

default关键字用来告诉编译器,对于类的一些特殊函数(如创建、复制、赋值和销毁对象时的函数),我们不需要自定义,让编译器提供标准的默认行为。

在前面的文章(【重学C++】【类】详细谈谈C++中的空类(面试常问))中,我们谈到了空类中的默认内容,编译器会默认生成默认构造函数、析构函数等一系列函数。但是显然开发者如果对此不了解,是不知道的。使用default关键字,显式地让编译器提供默认函数,可以提高程序的可读性和可维护性。

例如下面的示例代码,使用default关键字来指示编译器为MyClass提供默认的特殊成员函数实现。

class MyClass {
public:
    MyClass() = default;  // 默认构造函数
    MyClass(const MyClass&) = default;  // 默认拷贝构造函数
    MyClass& operator=(const MyClass&) = default;  // 默认赋值操作符
    ~MyClass() = default;  // 默认析构函数
};

1. delete关键字

delete关键字用于删除函数或特殊成员函数(如构造函数、拷贝构造函数、赋值操作符、析构函数)的定义,使得这些函数在程序中不可用

1.1 应用场景

delete关键字通常用于以下几种情况:

  1. 防止资源泄露:当类的实例管理着资源(如动态分配的内存)时,删除拷贝或赋值操作符可以防止资源被错误地共享或多次释放。

  2. 实现单例模式:确保一个类只能有一个实例,可以删除拷贝构造函数和赋值操作符。

  3. 保证对象的移动语义:在现代C++中,为了支持移动语义,开发者可能会删除拷贝或赋值操作符,而提供移动构造函数和移动赋值操作符。

  4. 私有化特殊成员函数:将默认的特殊成员函数设为delete,可以防止编译器自动生成它们,这在某些需要完全控制对象生命周期的情况下很有用。

1.2 示例

1.2.1 删除拷贝构造函数和赋值操作符

class NoCopy {
public:
    NoCopy(int value) : val(value) {}
    ~NoCopy() {}

    // 删除拷贝构造函数
    NoCopy(const NoCopy&) = delete;

    // 删除赋值操作符
    NoCopy& operator=(const NoCopy&) = delete;
private:
    int val;
};

上述代码中创建了一个不允许拷贝和赋值的类NoCopy。尝试拷贝或赋值NoCopy的实例将会导致编译错误。

NoCopy a;
// NoCopy b = a;  // 编译错误:拷贝构造函数已删除
// a = b;  // 编译错误:拷贝赋值运算符已删除

1.2.2 删除默认构造函数

class Singleton {
private:
    static Singleton* instance;

    Singleton() {}  // 私有的默认构造函数

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    // 删除默认构造函数
    Singleton() = delete;
};

在这个例子中,实现了一个单例模式的类Singleton。我们删除了默认构造函数,确保不能通过Singleton()这样的表达式来创建类的实例,只能通过Singleton::getInstance()来获取单例对象。

2. 总结

本文我们主要学习了现代C++中的两个特性:default关键字和delete关键字,用来精准控制类的行为。内容很简单,但是在现实项目中,很实用,一定要会。C++标准库中很多类都使用了这些特性,例如std::mutex不允许拷贝等。

如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


  • 大家好,我是 同学小张,持续学习C++进阶知识AI大模型应用实战案例
  • 欢迎 点赞 + 关注 👏,持续学习持续干货输出
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜同学小张 🙏

本站文章一览:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中,`default`关键字有多种用法,取决于上下文。 1. 默认构造函数:`default`关键字可用于显式声明一个的默认构造函数。当一个没有任何用户定义的构造函数时,编译器会自动生成一个默认构造函数。如果你想显式地声明一个默认构造函数,可以使用`default`关键字来定义它。例如: ```cpp class MyClass { public: MyClass() = default; // 显式声明默认构造函数 }; ``` 2. 默认析构函数:与默认构造函数似,编译器也会自动生成一个默认析构函数,当没有用户定义的析构函数时。同样地,你可以使用`default`关键字来显式声明一个默认析构函数。例如: ```cpp class MyClass { public: ~MyClass() = default; // 显式声明默认析构函数 }; ``` 3. 默认拷贝构造函数和移动构造函数:当一个没有显式定义拷贝构造函数或移动构造函数时,编译器会自动生成默认的拷贝构造函数和移动构造函数。你可以使用`default`关键字来显式声明这些默认构造函数。例如: ```cpp class MyClass { public: MyClass(const MyClass& other) = default; // 显式声明默认拷贝构造函数 MyClass(MyClass&& other) = default; // 显式声明默认移动构造函数 }; ``` 4. 默认赋值运算符:与拷贝构造函数和移动构造函数似,编译器也会自动生成默认的赋值运算符。你可以使用`default`关键字来显式声明默认赋值运算符。例如: ```cpp class MyClass { public: MyClass& operator=(const MyClass& other) = default; // 显式声明默认拷贝赋值运算符 MyClass& operator=(MyClass&& other) = default; // 显式声明默认移动赋值运算符 }; ``` 这些是`default`关键字C++中的几种常见用法,它们可以帮助你控制编译器生成的默认函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学小张

如果觉得有帮助,欢迎给我鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值