C++中的空构造函数:

Empty Constructors in C++:

本文关键字:构造函数 C++      更新时间:2023-10-16

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

这是C.h文件。

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

还有我的.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?

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

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

关于其他构造函数,您应该更喜欢初始化列表:

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

否则,您要做的是对默认构造的对象进行赋值

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

C() = default;

这比C(){}更整洁。

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

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

这两个特性避免了创建自己的无参数构造函数来默认初始化成员。因此,当应用这两个功能时,你的类可以是这样的:

class C
{
private:
    string A;
    double B = 0;
public:
   C() = default;
   C(string, double);  
}

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

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

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

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

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

您是唯一能够回答此问题的人,因为它完全取决于您对默认构造对象的需求。既然你还没有提到你的要求是什么,就不可能给出一个明确的答案。有些人会猜测您应该将B初始化为0,但这个决定应该基于您的设计,而不是基于"良好"编程实践的各种概念。

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

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

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

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

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

您做得很正确,可以通过编译代码来查看。默认构造函数将通过调用字符串和double的默认构造函数来初始化它们。如果您在类中定义任何构造函数,它将隐藏编译器为您创建的默认构造函数。

你可以通过这样写来改进你的构造函数代码

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