如果我们使用参数构造函数,我们是否需要在c++中提供默认构造函数
Should we need to provide a default constructor in c++ if we use a parameter constructor?
如果我们使用参数构造函数,我们是否需要在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];
也不行。
如果您不需要在堆栈中或从堆中创建数组,那么不提供默认构造函数是可以的。
相关文章:
- 为什么我们在C++中使用手动复制构造函数?
- 我们可以用参数化构造函数初始化结构的数组吗?
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- 为什么我们需要在构造函数的初始化列表中使用 std::move?
- 我们可以直接为任何数据成员赋值. 为什么要使用构造函数?
- 我们如何使用下面的集合构造函数构造设置元素
- 如果我们有 (N)RVO,当实际调用移动构造函数时?
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 我们可以在构造函数中定义静态类成员吗?
- 我们可以在不使用构造函数的情况下推回包含矢量的结构
- 为什么我们应该为initializer_list的情况过多载荷转发构造函数
- 为什么我们需要在move构造函数中将右值引用设置为null
- 为什么我们可以在 C++ 的构造函数中使用声明的变量
- 当我们有用于设置值的 setter 时,为什么我们使用参数化构造函数
- 我们可以说构造函数创建对象
- 我们是否应该从派生类调用基类移动复制/分配构造函数
- 如果我们在c++中重载构造函数,那么默认构造函数是否仍然存在
- 为什么我们需要一个用户提供的const对象构造函数