C++ 类相关内容
1 默认构造
在C++中,如果你遇到了错误信息“the default constructor of ‘B’ cannot be referenced – it is a deleted function”,这通常意味着类B
的默认构造函数(即不带参数的构造函数)被声明为= delete
了,或者被隐式地删除了。
以下是几种可能导致默认构造函数被删除的情况:
-
显式删除:
如果你在类定义中显式地写了B() = delete;
,那么默认构造函数就被删除了,不能被调用。class B { public:B() = delete; // 显式删除默认构造函数// ... 其他成员函数 ... };
-
继承:
如果你从某个基类继承了一个不可访问或者被删除的构造函数,那么这个构造函数也不会被继承类使用。 -
含有默认初始化的成员变量:
如果类B
中含有无法默认初始化的成员变量(比如引用类型、没有默认构造函数的类类型等),并且你没有提供自定义的默认构造函数,那么编译器会尝试为你生成一个默认构造函数,但会因为无法初始化这些成员而失败,并导致默认构造函数被隐式删除。class NonDefaultConstructible { public:NonDefaultConstructible(int) {} // 没有默认构造函数 };class B { public:NonDefaultConstructible nc; // 无法默认初始化// ... 其他成员函数 ... }; // 编译器不会为B生成默认构造函数,因为它不能初始化nc
-
移动构造函数和移动赋值运算符:
在某些情况下,如果你定义了移动构造函数或移动赋值运算符,并且没有显式地定义默认构造函数,编译器可能认为默认构造函数是不必要的,因此可能不会为它生成。然而,这种情况通常不会直接导致默认构造函数被删除,而是可能会导致它在某些情况下不被使用。 -
使用了
= default
但条件不满足:
如果你尝试使用B() = default;
来显式地要求编译器生成默认构造函数,但条件不满足(比如因为上述的无法默认初始化的成员变量),那么编译器会报错而不是生成默认构造函数。
为了解决这个问题,你可以:
- 提供一个自定义的默认构造函数,确保所有成员都被正确初始化。
- 如果不需要默认构造函数,确保你的代码中没有尝试调用它。
- 如果错误是因为继承,检查基类并确保你有权访问所需的构造函数。
- 如果是因为成员变量无法默认初始化,考虑提供一个合适的初始化值或者更改成员变量的类型。