为什么我需要默认构造函数,如果我从不显式调用它

Why do I need a default constructor, if I never call it explicitly?

本文关键字:调用 默认 构造函数 为什么 如果      更新时间:2023-10-16

我正在学习一些C++,来自Java...

我写了几个类,Vector(一个包含分量 x、y、z 的 3D 向量)和 Bezier(一个三次贝塞尔曲线,基于 4 个输入向量)。

Vector无需定义默认构造函数即可正常工作。

Bezier给了我一个编译错误:

贝塞尔·

class Bezier
{
  public:
    Vector p1;
    Vector cp1;
    Vector cp2;
    Vector p2;
    Bezier(const Vector &p1, const Vector &cp1, const Vector &cp2, const Vector &p2);
};

贝塞尔.cpp

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
{
  p1 = p1_;
  cp1 = cp1_;
  cp2 = cp2_;
  p2 = p2_;
}

错误:

在构造函数 'Bezier::Bezier(const Vector&, const Vector&, const Vector&, const Vector&)'中: 错误:调用"Vector::Vector()"没有匹配函数

编译器似乎希望我创建一个默认的构造函数Vector(),尽管我不需要它。我错过了一些明显的东西吗?

输入构造函数时,尚未初始化成员变量。因此,您的代码尝试调用 p1cp1 等的默认构造函数,以便在根据 p1 = p1_; ... 覆盖该定义之前初始化它们。若要告知代码根本不调用默认构造函数,请使用 Bezier::Bezier(...) : p1(p1_), cp1(cp1_), ... {} 。这绕过了对默认构造函数的需求,而是立即通过复制构造函数初始化Vector的所有实例。

你的代码(就像现在一样)需要默认的矢量构造函数。

再看这段代码:

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
{
  p1 = p1_;
  cp1 = cp1_;
  cp2 = cp2_;
  p2 = p2_;
}

它的作用是默认构造所有 4 个向量,然后为它们赋值

如果你想摆脱默认构造步骤并使用带有参数的构造函数构造这些向量,你可以这样写:

Bezier::Bezier(const Vector &p1_, const Vector &cp1_, const Vector &cp2_, const Vector &p2_)
  : p1(p1_), cp1(cp1_), cp2(cp2_), p2(p2_)
{}