0

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;
}
4

2 回答 2

5

假设SomeClass有一个可公开访问的默认构造函数,是的。

请注意,两者之间存在差异

  1. 有一个可公开访问的默认构造函数(我所说的)和
  2. 没有非公开声明的默认构造函数(你所说的)

对于以下类2.是真的,但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) {}
};
于 2010-07-15T17:38:49.637 回答
1

不,如果没有默认构造函数,它将无法编译。在这种情况下,没有编译器生成的默认构造函数,因为您定义了另一个构造函数。“如果需要并且用户没有声明其他构造函数,编译器将尝试生成一个。” -- C++ 编程语言,Stroustrup

如果你真的想使用new SomeClass[5],你还必须提供一个默认构造函数。

于 2010-07-15T18:11:10.930 回答