11

在我的代码中,我正在执行以下操作,但我不确定我是否被“允许”或者它是否是一种好的设计技术。我需要创建一个空的构造函数,但我还需要一个构造函数来初始化给定参数的变量。所以我正在做以下事情:

这是Ch文件。

 class C
 {
   private:
    string A;
    double B;
   public:
   //empty constructor
   C();
   C(string, double);  
 }

还有我的 C.cpp 文件:

//this is how I declare the empty constructor
 C::C()
  {

  }


  C::C(string a, double b)
  {
         A = a;
         B = b;
  }

我声明空构造函数的方式是正确的,还是需要设置 A=NULL 和 B=0.0?

4

7 回答 7

12

您的空构造函数不会执行您想要的操作。除非你自己做,double否则数据成员不会被零初始化。将std::string被初始化为一个空字符串。所以默认构造函数的正确实现就是

C::C() : B() {} // zero-initializes B

关于另一个构造函数,您应该更喜欢初始化列表:

C::C(const string& a, double b) : A(a), B(b) {}

否则,您正在做的是对默认构造对象的分配。

于 2013-02-17T08:10:03.503 回答
6

在 C++11 及更高版本中,您可以使用以下内容生成默认的无参数构造函数:

C() = default;

这比 C(){} 更简洁。

这不会初始化成员。在 C++11 中,您可以在同一行声明中初始化成员:

int m_member = 0; // this is a class member

这两个功能避免了必须创建自己的无参数构造函数来默认初始化成员。因此,在应用这 2 个功能时,您的课程可能看起来像这样:

class C
{
private:
    string A;
    double B = 0;

public:
   C() = default;
   C(string, double);  
}
于 2019-05-29T12:27:03.710 回答
5

可以这样做并将构造函数留空,但您应该知道未初始化的字段具有未定义的值。string是一个类,它的默认构造函数负责它的初始化,但double在这里没有初始化(在你的默认构造函数中),它的值是未定义的(它可能是内存中先前存在的任何值)。

于 2013-02-17T04:46:39.417 回答
2

你是唯一可以回答这个问题的人,因为这完全取决于你对默认构造对象的要求。由于您没有提及您的要求是什么,因此无法给出明确的答案。有些人会猜测您应该初始化B为 0,但该决定应该基于您的设计,而不是基于“良好”编程实践的各种概念。

于 2013-02-17T13:28:34.463 回答
2

A 是std::string,您不能将其设置为NULL但可以设置为空字符串,并std::string具有默认构造函数,默认将其初始化为空字符串。

C::C()
:B(0.0)
{
}

也许您需要一个带有默认参数的构造函数构造函数而不是两个构造函数?

C(const string& a= "", double b= 0.0)
: A(a),
  B(b)
{
}
于 2013-02-17T04:44:52.743 回答
1

您可以保持原样。您可以这样做,因为两者stringdouble都可以默认构造。这意味着您可以说string foo;并且不会出现任何错误。

将此与此处发生的情况进行对比:

class Bar{
    private:
        Bar(); //Explicitly private;
};
Bar b;

这里我们得到一个关于没有Bar::Bar()找到构造函数的错误。

至于这是否是一个好主意:如果不知道这个类将在什么情况下使用,很难说。也许让它处于未配置的位置是完全明智的。但是对于许多类,例如表示文件的类,允许不指向任何文件的文件对象显然是错误的。

于 2013-02-17T04:42:04.743 回答
0

你做对了,你可以通过编译你的代码来看到它。您的默认构造函数将通过调用其默认构造函数来初始化字符串和加倍。如果您在类中定义任何构造函数,它将隐藏编译器为您创建的默认构造函数。

您可以通过像这样编写它来改进您的构造函数代码

C::C(string a, double b):A(a), b(b)
{
}
于 2013-02-17T04:45:07.363 回答