SomeClass * initialEl = new SomeClass [5];必须编译,假设SomeClass没有非公开声明的默认构造函数?考虑:
/*
* SomeClass.h
*
*/
#ifndef SOMECLASS_H_
#define SOMECLASS_H_
class SomeClass
{
public:
SomeClass(int){}
~SomeClass(){}
};
#endif /* SOMECLASS_H_ */
/*
* main.cpp
*
*/
#include "SomeClass.h"
int main()
{
SomeClass* initialEl = new SomeClass[5];
delete[] initialEl;
return 0;
}
答案 0 :(得分:5)
假设SomeClass
有一个可公开访问的默认构造函数,是的。
请注意
之间存在差异对于以下类 2。为true但 1。不是:
class A {
SomeClass(const SomeClass&) {}
};
这是由于§12.1/ 5 (C ++ 03):
如果类X没有用户声明的构造函数,则隐式声明默认构造函数。 隐式声明的默认构造函数是其类的
inline public
成员。
通过更新,SomeClass
没有默认构造函数。你没有声明一个,因为你已经声明了另一个构造函数,编译器也不会隐式声明它。
如果您需要,您必须自己实施:
class A {
public:
SomeClass(int) {}
SomeClass() {}
};
或者让另一个构造函数符合默认构造函数:
class A {
public:
SomeClass(int=0) {}
};
答案 1 :(得分:1)
不,没有默认构造函数就不能编译。在这种情况下,没有编译器生成的默认构造函数,因为您已经定义了另一个构造函数。 “如果需要,编译器将尝试生成一个,如果用户没有声明其他构造函数。” - C ++编程语言,Stroustrup
如果你真的想使用new SomeClass[5]
,你也必须提供一个默认的构造函数。