为什么我的构造函数一直引用 C++ 中的默认构造函数?

MyB*_*g18 1 c++ c++20

我正在学习 c++ (20)。请看我的代码:

\n

MyClass.h

\n
class Spec\n{\nprivate:\n    int number;\n\npublic:\n    Spec() = delete;\n    Spec(int);\n};\n\nclass MyClass\n{\nprivate:\n    int id;\n    Spec spec;\n\npublic:\n    MyClass() = delete;\n    MyClass(int, Spec);\n};\n
Run Code Online (Sandbox Code Playgroud)\n

我的类.cpp

\n
#include "MyClass.h"\n\nSpec::Spec(int number)\n{\n    this->number = number;\n}\n\nMyClass::MyClass(int id, Spec spec)\n{\n    this->id = id;\n    this->spec = spec;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

编译时返回:

\n
/src/Hai.cpp: In constructor \xe2\x80\x98MyClass::MyClass(int, Spec)\xe2\x80\x99:\n/src/Hai.cpp:8:35: error: use of deleted function \xe2\x80\x98Spec::Spec()\xe2\x80\x99\n    8 | MyClass::MyClass(int id, Spec spec)\n
Run Code Online (Sandbox Code Playgroud)\n

我没有使用任何默认构造函数,而且我什至删除了它以确保。我不会在任何地方调用这些类的默认构造函数,并且我不希望这些类被默认构造。买了为什么编译器仍然问我应该有默认构造函数?与复制操作有关系吗?添加默认构造函数将处理错误,但我只想知道为什么。

\n

Tho*_*ler 5

private: Spec spec;事实上,您在 的 构造函数中没有成员初始值设定项列表MyClass会导致默认构造函数为 运行spec

)您的代码正在初始化构造函数(参数末尾)和(代码开头)之间的成员{,然后在构造函数中分配新值。

使用成员初始值设定项:

MyClass::MyClass(int id, Spec spec)
: id{id}, spec{spec}                   //  <- member initializer list
{
}
Run Code Online (Sandbox Code Playgroud)
id{id}
   ^ refers to the parameter id
^ refers to this->id
  ^  ^ uniform initialization curly braces
Run Code Online (Sandbox Code Playgroud)

  • @MyBug18 你想错了。需要理解的重要部分是初始化和赋值之间的区别(你称之为我自己做的事情)。如果您不使用初始化列表,那么您的类的每个成员都会在代码执行之前进行默认初始化。 (3认同)