You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类构造函数中default与delete修饰符的作用及逻辑影响

C++构造函数中default与delete修饰符的用法及代码实例分析

一、default修饰符的用法

  • 用来强制编译器生成默认版本的特殊成员函数,比如默认构造、拷贝构造、移动构造、各类赋值运算符等。
  • 默认情况下,如果类里自定义了其他构造函数,编译器就不会自动生成默认构造;这时如果还需要默认构造,就可以用default显式要求编译器生成。

二、delete修饰符的用法

  • 用来直接禁止编译器生成某个特殊成员函数,或者禁用某个函数的特定重载。
  • 最常见的场景是阻止类对象被拷贝、移动,避免不符合设计意图的对象复制操作。

三、结合给定代码分析实际影响

先看代码:

class MyClass : public ParentClass  
{  
public:  
    explicit MyClass(classA a, const classB b) : A(a), B{b} {}  
 
    MyClass() override = default;  
    MyClass(const MyClass&) = delete;  
    MyClass(MyClass&&) = delete;  
    MyClass& operator=(const MyClass&) = delete;  
    MyClass& operator=(MyClass&&) = delete;  

    void parentFunc() override;  
    void childFunc();  

private:  
    classA& A;  
    const classB& B;  
};  

1. 关于MyClass() override = default;

  • 首先说明:默认构造函数本身不是虚函数,这里的override写法是错误的,编译器会直接报错。
  • 退一步说,即便去掉override,因为类里已经定义了带参数的构造函数,编译器原本不会自动生成默认构造;这里用default是想强制生成,但类的私有成员是两个引用(classA& A和const classB& B),引用必须在构造函数初始化列表里完成初始化,而编译器生成的默认构造函数做不到这一点,所以这行代码必然导致编译失败。

2. 被delete的拷贝/移动相关函数

这四个delete声明直接锁死了对象的复制行为:

  • MyClass(const MyClass&) = delete;:禁止拷贝构造,不能用一个已有的MyClass对象复制出另一个新对象,比如MyClass obj2(obj1);这种写法会编译报错。
  • MyClass(MyClass&&) = delete;:禁止移动构造,不能通过临时对象的移动语义创建新对象,比如MyClass obj = MyClass(a, b);会编译报错。
  • MyClass& operator=(const MyClass&) = delete;:禁止拷贝赋值,不能把一个对象的值赋值给另一个已存在的对象,比如obj2 = obj1;会编译报错。
  • MyClass& operator=(MyClass&&) = delete;:禁止移动赋值,不能把临时对象的资源转移给已存在的对象,比如obj1 = MyClass(c, d);会编译报错。

对程序逻辑的整体影响

  • 这个类的对象只能通过带参数的构造函数创建,完全不能被拷贝、移动,也无法用默认构造创建(因为默认构造的声明本身有问题,且无法初始化引用成员)。
  • 这种设计一般用于不需要对象复制的场景,比如单例类、持有独占资源的类,但代码里的默认构造声明是明显的错误,需要修正。

内容的提问来源于stack exchange,提问作者Naresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:17:14