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

问题描述 投票:0回答:1

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

我的班级.h

class Spec
{
private:
    int number;

public:
    Spec() = delete;
    Spec(int);
};

class MyClass
{
private:
    int id;
    Spec spec;

public:
    MyClass() = delete;
    MyClass(int, Spec);
};

我的班级.cpp

#include "MyClass.h"

Spec::Spec(int number)
{
    this->number = number;
}

MyClass::MyClass(int id, Spec spec)
{
    this->id = id;
    this->spec = spec;
}

编译时返回:

/src/Hai.cpp: In constructor ‘MyClass::MyClass(int, Spec)’:
/src/Hai.cpp:8:35: error: use of deleted function ‘Spec::Spec()’
    8 | MyClass::MyClass(int id, Spec spec)

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

c++ c++20
1个回答
5
投票

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

您的代码正在初始化构造函数的

)
(参数结束)和
{
(代码开始)之间的成员,然后在构造函数中分配新值。

使用成员初始值设定项:

MyClass::MyClass(int id, Spec spec)
: id{id}, spec{spec}                   //  <- member initializer list
{
}
id{id}
   ^ refers to the parameter id
^ refers to this->id
  ^  ^ uniform initialization curly braces
© www.soinside.com 2019 - 2024. All rights reserved.