我正在学习 c++ (20)。请看我的代码:
\nMyClass.h
\nclass 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};\nRun 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}\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n我没有使用任何默认构造函数,而且我什至删除了它以确保。我不会在任何地方调用这些类的默认构造函数,并且我不希望这些类被默认构造。买了为什么编译器仍然问我应该有默认构造函数?与复制操作有关系吗?添加默认构造函数将处理错误,但我只想知道为什么。
\nprivate: 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)