为什么我需要默认构造函数,如果我从不显式调用它
Why do I need a default constructor, if I never call it explicitly?
我正在学习一些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()
,尽管我不需要它。我错过了一些明显的东西吗?
输入构造函数时,尚未初始化成员变量。因此,您的代码尝试调用 p1
、cp1
等的默认构造函数,以便在根据 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_)
{}
相关文章:
- 如何在C++中调用默认模板功能参数?
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 没有用于调用默认构造函数的匹配函数
- 为什么指针对象没有调用默认构造函数
- 调用默认构造函数时不引用它
- 为什么我的对象声明不调用默认构造函数?
- 为什么要尝试调用默认构造函数?
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 是否可以从移动构造函数调用默认构造函数?
- 为什么类型变量;不调用默认 CTR
- 声明对象而不调用默认构造函数
- 作为参数的空初始值设定项列表不调用默认构造函数
- 如果类划分为单独的文件,则不调用默认构造函数
- 为什么"S x({})"仅在GCC 7/C++1z模式下调用默认构造函数?
- C++ 继承基构造函数,但仍调用默认派生构造函数
- 在返回语句中调用默认构造函数
- 在构造函数参数中调用默认构造函数
- 如何防止在基类初始化器中调用默认构造函数?
- 如何在以下C 代码中在同一对象上调用默认值和复制构造函数