如果我们使用参数构造函数,我们是否需要在c++中提供默认构造函数

Should we need to provide a default constructor in c++ if we use a parameter constructor?

本文关键字:构造函数 我们 c++ 默认 是否 参数 如果      更新时间:2023-10-16

如果我们使用参数构造函数,我们是否需要在c++中提供默认构造函数?我的代码是这样的。

ReadConfigParams::ReadConfigParams(char *file)

这取决于您希望ReadConfigParams类的客户端如何实例化该类的对象。

如果类ReadConfigParams总是需要文件名(在大多数情况下),则不应定义默认构造函数,因为在没有关联文件的情况下实例化ReadConfigParam是没有意义的。这将有效地防止客户端在没有给定文件名的情况下创建此类对象。

但是,如果类ReadConfigParams可以提供一些默认配置值,那么您应该定义一个默认构造函数。这将使此类的客户端能够实例化,从而访问默认值,而无需进行文件读取操作。

通常,如果您没有为类声明默认构造函数,编译器会为您提供一个。

但是,请注意,只有在不提供任何构造函数的情况下,编译器才会创建默认构造函数。对于您的示例,您提供了一个接受一个参数的构造函数,然后编译器将NOT为您创建默认构造函数。

示例1:

class A
{
};
int main() 
{
    A a; // OK, as the compiler creates one for you
}

示例2:

class A
{
public:
    A(int){}
};
int main() 
{
    A a; // NOT OK, error: no appropriate default constructor available!
}

示例3:

class A
{
public:
    A(){}
    A(int){}
};
int main() 
{
    A a; // OK, as you explicitly provide one default constructor
}

此外,根据"C++11–ISO-IEC 14882-2011"§8.5/6:

如果程序调用常量限定类型T的对象的默认初始化,则T应为具有用户提供的默认构造函数的类类型。

您可以查看此线程以了解更多信息。

问题如果我们使用参数构造函数,我们是否需要在c++中提供默认构造函数?

答案取决于情况。

如果要创建对象数组,则必须提供默认构造函数。

ReadConfigParams array[10];

如果你有一个没有默认构造函数,它将不起作用。类似地,您不能使用operator new来分配对象的数组。

ReadConfigParams* arrayPtr = new ReadConfigParams[10];

也不行。

如果您不需要在堆栈中或从堆中创建数组,那么不提供默认构造函数是可以的。

相关文章: