C++ 如何处理所需的默认构造函数

C++ 如何处理所需的默认构造函数,c++,C++,在为我的一个类(其中包含其他UDT的一些对象)编写复制构造函数时,我需要为这些UDT创建一个默认构造函数,即使它们从未真正打算拥有一个 实现一个空白的默认构造函数并使用它可以吗?唯一调用默认构造函数的时间是在复制过程中,即创建对象,然后将相应对象的值复制到对象中。因此,在默认构造函数中分配给对象的任何值都不会实际使用 我看到的问题是,一些成员变量没有在空白的默认构造函数中初始化。我应该写一个给出伪值的吗?还有其他建议的处理方法吗 编辑:我知道如果我要为其他类定义复制构造函数,复制构造函数不需要默

在为我的一个类(其中包含其他UDT的一些对象)编写复制构造函数时,我需要为这些UDT创建一个默认构造函数,即使它们从未真正打算拥有一个

实现一个空白的默认构造函数并使用它可以吗?唯一调用默认构造函数的时间是在复制过程中,即创建对象,然后将相应对象的值复制到对象中。因此,在默认构造函数中分配给对象的任何值都不会实际使用

我看到的问题是,一些成员变量没有在空白的默认构造函数中初始化。我应该写一个给出伪值的吗?还有其他建议的处理方法吗

编辑:我知道如果我要为其他类定义复制构造函数,复制构造函数不需要默认构造函数,但我没有,所以它确实需要它

你说:

创建对象时,然后 对应对象的值 都复制到了它

但是问问你自己,“对应对象”的值首先是如何到达那里的。即,如何创建相应的对象


可能有助于为您澄清问题。

您真的确定需要一个复制构造函数吗?拥有一个默认构造函数可以使用的类是不寻常的(但并非不可能),但您需要一个自定义副本构造函数。也许您可以发布类的代码?

这听起来不是实现复制构造函数的最佳方法。如果包含的类型本身提供了复制构造函数,则使用它们。一个类型不提供默认构造函数可能是有原因的。

我首先要问,为什么复制那些UDT涉及默认构造函数,而不是更合适的复制构造函数。我还想问,对象处于默认初始化状态意味着什么——如果它确实意味着什么,那么一定要实现它

如果对默认初始化没有合理的意义,并且必须使用默认构造函数定义对象,那么我认为可以实现默认构造函数


但是,并非所有对象都可以获得默认构造函数,因此修复问题的根源仍然是一个好主意。

您可以通过要求其他对象也具有副本构造函数来防止默认构造函数(或者使用特殊的构造函数来传递构造对象所需的所有信息。通常使用默认构造函数来初始化所有成员变量是一个非常糟糕的主意。至少要确保另一个类的默认构造函数初始化了所有成员。

我觉得您需要为t定义复制构造函数当您通过复制其他对象来创建其他类的对象时,创建其他类。

如果您在复制构造函数中使用初始值设定项列表,则不需要默认构造函数:

#include <iostream>
using namespace std;
class Foo {
  Foo();            /* no default constructor */
public:
  Foo(int i)        { cout << "Foo constructor (int)"  << endl; }
  Foo(const Foo& f) { cout << "Foo constructor (copy)" << endl; }
};
class Bar {
  Foo f;
public:
  Bar()             : f(1)   { cout << "Bar constructor (default)" << endl; }
  Bar(const Bar& b) : f(b.f) { cout << "Bar constructor (copy)"    << endl; }
};
int main(void) {
  Bar b;
  Bar b_=b;
  return 0;
}

记住一条经验法则,只要某些东西不是规范的一部分,编译器就不会为您这样做

若您的类包含用户定义的类型,并且当您创建它的对象时,编译器必须为每个对象调用默认构造函数

但初始化对象的数据成员不是编译器的任务,但您应该这样做


对于您提到的情况,您需要自己的自定义复制构造函数和赋值运算符。

如果您不希望编译器生成复制构造函数或根本不需要复制构造函数,请声明私有复制构造函数,但不提供任何定义(代码)编译器将看到声明,而不是生成声明。也可以使用赋值运算符执行此操作


我对我的单例类执行此操作。

如果您的类不是默认构造的,请不要创建默认构造函数。
如果是的话,那么我相信您可以找到一个合理的初始化方法,所以这就是您应该使用的方法。

这个问题,您所说的方式,似乎没有任何意义。复制构造函数不需要默认构造函数,正如您似乎相信的那样。复制构造函数是一个完全独立的完整构造函数,用于构造对象完全靠自己

如果使用复制构造函数构造对象,则不需要默认构造函数。如果使用默认构造函数构造对象,则不能对其使用复制构造函数。不可能对同一对象“应用”两个不同的构造函数

如果您以两种方式构造对象,那么它们将成为两个完全独立的构造函数,每个构造函数都有自己的独立目的。在这种情况下,您应该问自己的问题是您希望如何构造对象。只有您知道这一点


同样,你需要澄清你的问题。我怀疑(从你的描述)可能您试图实现的不是复制构造函数,而是复制赋值运算符。但这只是一个猜测。

欢迎来到StackOverflow!第一个问题很好。最好是有一些示例代码。这两个类都有复制构造函数以外的构造函数。您所说的不是真的。这是一个非常好的问题在当前C++中,你不能从另一个调用“一个构造函数”。所以,如果你使用复制构造函数,你就不能使用默认构造函数(它根本不可能)。,而不管您是否使用初始值设定项列表。原始示例中的要点是,Foo的默认构造函数不是通过复制调用的。我编辑了该示例以删除Foo的默认构造函数,以更好地说明这一点。这些类显然具有除复制构造函数之外的构造函数--您还有什么其他方法可以使用复制构造函数是否要创建对象的第一个实例?我的理解是,目标是避免添加不需要的默认构造函数
Foo constructor (int)
Bar constructor (default)
Foo constructor (copy)
Bar constructor (copy)