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
相关产品推荐
相关产品推荐

