如果我们使用参数构造函数,是否需要在c ++中提供默认构造函数? 我的代码是这样的。
ReadConfigParams::ReadConfigParams(char *file)
答案 0 :(得分:1)
这取决于您希望ReadConfigParams类的客户端如何实例化此类的对象。
如果类ReadConfigParams总是需要文件名(与大多数情况一样),则不应定义默认构造函数,因为没有关联文件实例化ReadConfigParams没有意义。这将有效地防止客户端在没有给定文件名的情况下创建此类的对象。
但是如果类ReadConfigParams可以提供一些默认配置值,那么你应该定义一个默认的构造函数。这将使该类的客户端能够实例化并因此访问默认值而无需文件读取操作。
答案 1 :(得分:1)
通常,如果您没有为类声明默认构造函数,编译器会为您提供一个。
但请注意,默认构造函数只有在没有提供任何构造函数的情况下才会由编译器创建。对于您的示例,您提供了一个带有一个参数的构造函数,然后编译器将 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:
如果程序要求对const限定类型
T
的对象进行默认初始化,则T
应为具有用户提供的默认构造函数的类类型。
您可以查看this thread了解详情。
答案 2 :(得分:0)
问题如果我们使用参数构造函数,是否需要在c ++中提供默认构造函数?
答案取决于。
如果要创建对象数组,则必须提供默认构造函数。
ReadConfigParams array[10];
如果您没有默认构造函数,将无效。同样,您无法使用operator new
分配对象数组。
ReadConfigParams* arrayPtr = new ReadConfigParams[10];
也不起作用。
如果您不需要在堆栈或堆中创建数组,则不提供默认构造函数。