如果我从未明确地调用它,为什么我需要一个默认的构造函数?

时间:2016-02-18 19:42:06

标签: c++ oop

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

我写了几个类,Vector(一个带有分量x,y,z的三维矢量)和Bezier(一个基于4个输入向量的三次贝塞尔曲线)。

Vector无法定义默认构造函数。

Bezier给了我一个编译错误:

Bezier.h

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

Bezier.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(),尽管我不需要它。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

您的代码(现在是)需要默认的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_)
{}